Script 1 for Kitchel et al.Ā 2023 in prep taxonomic diversity
manuscript.
library(tidyverse)
library(sp)
library(raster)
#library(rgeos)
library(rgbif)
library(viridis)
library(gridExtra)
library(rasterVis)
library(concaveman)
library(sf)
library(cowplot)
library(data.table)
set.seed(1)
Pull in compiled and cleaned data from FishGlob downloaded on
November 28 2022 (V 1.5). This is typically compiled by Dr.Ā Aurore
Maureaud. This includes public and private data and therefore link
cannot be shared. However with editing you can run analyses for public
trawl surveys.
| AI |
Aleutian Islands |
Aleutian Islands |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| BITS-1 |
Baltic Sea Q1 |
Baltic Sea Quarter 1 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| BITS-4 |
Baltic Sea Q4 |
Baltic Sea Quarter 4 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| CHL |
Chile |
Chile |
Universidad de Concepción, Chile |
South America |
Requires data request |
Daniela Yepson daniela.yepsen@gmail.com and Luis Cubillos lucubillos@gmail.com |
Included |
| COL |
Colombia |
Colombian Caribbean |
Universidad Nacional de Colombia |
South America |
Requires data request |
Camilo B. Garcia cbgarciar@unal.edu.co |
Too few years |
| DFO-HS |
Hecate Strait |
Hecate Strait |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/780a1c02-1f9c-4994-bc70-a0e9ef8e3968
and OceanAdapt: https://zenodo.org/records/8103080 |
Too few years |
| DFO-NF |
Newfoundland |
Newfoundland |
Department of Fisheries and Oceans |
Canada |
Requires data request |
Mariano Koen-Alonso mariano.koen-alonso@dfo-mpo.gc.ca |
Included |
| DFO-QCS |
Queen Charlotte Sound |
Queen Charlotte Sound |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/a278d1af-d567-4964-a109-ae1e84cbd24a
and OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| DFO-SOG |
Strait of Georgia |
Straight of Georgia |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/d880ba18-8790-41a2-bf73-e9247380759b
and OceanAdapt: https://zenodo.org/records/8103080 |
Too few years |
| DFO-WCHG |
West Coast Haida Gwaii |
West Coast Haida Gwaii |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/5ee30758-b1d6-49fe-8c4e-5136f4b39ad1
and OceanAdapt: https://zenodo.org/records/8103080 |
Too few years |
| DFO-WCVI |
West Coast Vancouver Island |
West Coast Vancouver Island |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/557e42ae-06fe-426d-8242-c3107670b1de
and OceanAdapt: https://zenodo.org/records/8103080 |
Too few years |
| EBS |
Eastern Bering Sea |
Eastern Bering Sea |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| EVHOE |
Bay of Biscay |
Bay of Biscay |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| FALK |
Falkland Islands |
Falkland Islands |
Falkland Islands Fisheries Department |
Southern Ocean |
Requires data request |
Alexander Arkhipkin aarkhipkin@fisheries.gov.fk and Jorge Ramos jeramos@fisheries.gov.fk |
Excluded after spatial temporal standardization in next script |
| FR-CGFS |
English Channel |
English Channel |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| GIN |
Guinea |
Guinea |
National Center of Fisheries Sciences of Boussoura, Conakry,
Republic of Guinea |
Africa |
Requires data request |
Mohammed Lamine Camara mlcamara.kennedy@gmail.com |
Inconsistent sampling through space and time |
| GMEX-Summer |
Gulf of Mexico Summer |
Gulf of Mexico Summer |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| GMEX-Fall |
Gulf of Mexico Fall |
Gulf of Mexico Fall |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| GOA |
Gulf of Alaska |
Gulf of Alaska |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| GRL-DE |
Greenland |
Greenland |
Thuenen Institute of Sea Fisheries |
Europe |
Requires data request |
Karl-Michael Werner karl-michael.werner@thuenen.de |
Included |
| GSL-N |
N Gulf of St.Ā Lawrence |
Northern Gulf of St.Ā Lawrence |
Department of Fisheries and Oceans |
Canada |
Public |
See OceanAdapt: https://zenodo.org/records/8103080 for specific DFO
links |
Included |
| GSL-S |
S Gulf of St.Ā Lawrence |
Southern Gulf of St.Ā Lawrence |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/1989de32-bc5d-c696-879c-54d422438e64
and OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| ICE-GFS |
Iceland |
Iceland |
Marine and Freshwater Research Institute, Iceland |
Europe |
Requires data request |
Jón Sólmundsson jon.solmundsson@hafogvatn.is |
Included |
| IE-IGFS |
Irish Sea |
Irish Sea |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| IS-TAU |
Israel |
Israel |
Tel Aviv University |
Asia |
Requires data request |
Jonathan Belmaker jonathan.belmaker@gmail.com |
Too few years |
| IS-MOAG |
Israel |
Israel |
Israeli Ministry of Agriculture |
Asia |
Requires data request |
Oren Sonin orens@moag.gov.il and Dori Edelist blackreefs@gmail.com |
Inconsistent sampling through space and time |
| MEDITS |
Mediterranean |
Mediterranean |
Multiple |
Europe |
Requires data request |
Contact corresponding author for contacts |
Included |
| MRT |
Mauritania |
Mauritania |
Institut Mauritanien de Recherches Océanographiques et des Pêches,
Nouadhibou, Mauritania |
Africa |
Requires data request |
Beyah Meissa bmouldhabib@gmail.com |
Inconsistent sampling through space and time |
| NAM |
Namibia |
Namibia |
National Marine Information and Research Centre, Ministry of
Fisheries and Marine Resources, Namibia |
Africa |
Requires data request |
Johannes Kathena john.kathena@mfmr.gov.na |
Included |
| NEUS-Fall |
NE US Fall |
Northeast USA Fall |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| NEUS-Spring |
NE US Spring |
Northeast USA Spring |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| NIGFS-1 |
N Ireland Q1 |
North Ireland Quarter 1 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| NIGFS-4 |
N Ireland Q4 |
North Ireland Quarter 4 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| Nor-BTS-3 |
Barents Sea Norway Q3 |
Barents Sea Norway Q3 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| NS-IBTS-1 |
N Sea Q1 |
North Sea Quarter 1 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| NS-IBTS-3 |
N Sea Q3 |
North Sea Quarter 3 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| NZ-CHAT |
Chatham Rise NZ |
Chatham Rise New Zealand |
National Institute of Water and Atmospheric Research Limited, New
Zealand |
Oceania |
Requires data request |
Richard OāDriscoll richard.odriscoll@niwa.co.nz and Fabrice Stephenson fabrice.stephenson@waikato.ac.nz |
Included |
| NZ-ECSI |
E Coast S Island NZ |
East Coast South Island New Zealand |
National Institute of Water and Atmospheric Research Limited, New
Zealand |
Oceania |
Requires data request |
Richard OāDriscoll richard.odriscoll@niwa.co.nz and Fabrice Stephenson fabrice.stephenson@waikato.ac.nz |
Included |
| NZ-SUBA |
Sub-Antarctic NZ |
Sub-Antarctic New Zealand |
National Institute of Water and Atmospheric Research Limited, New
Zealand |
Oceania |
Requires data request |
Richard OāDriscoll richard.odriscoll@niwa.co.nz and Fabrice Stephenson fabrice.stephenson@waikato.ac.nz |
Included |
| NZ-WCSI |
W Coast S Island NZ |
West Coast South Island New Zealand |
National Institute of Water and Atmospheric Research Limited, New
Zealand |
Oceania |
Requires data request |
Richard OāDriscoll richard.odriscoll@niwa.co.nz and Fabrice Stephenson fabrice.stephenson@waikato.ac.nz |
Included |
| PT-IBTS |
Portugal |
Portugal |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| ROCKALL |
Rockall Plateau |
Rockall Plateau |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| S-GEORG |
S Georgia |
South Georgia |
British Antarctic Survey |
Southern Ocean |
Requires data request |
Mark Belchier mark.belchier@gov.gs and Martin Collins macol@bas.ac.uk |
Included |
| SCS-Fall |
Scotian Shelf Fall |
Scotian Shelf Summer |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164
and OceanAdapt: https://zenodo.org/records/8103080 |
Too few years |
| SCS-SPRING |
Scotian Shelf Spring |
Scotian Shelf Spring |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/fecf045a-95a2-4b69-8a40-818649a62716
and OceanAdapt: https://zenodo.org/records/8103080 |
Too much data loss after spatial temporal standardization |
| SCS-SUMMER |
Scotian Shelf Summer |
Scotian Shelf Summer |
Department of Fisheries and Oceans |
Canada |
Public |
https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164
and OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| SEUS-fall |
SE US Fall |
Southeast USA Fall |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| SEUS-spring |
SE US Spring |
Southeast USA Spring |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| SEUS-summer |
SE US Summer |
Southeast USA Summer |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| SWC-IBTS-1 |
Scotland Shelf Sea Q1 |
Scotland Shelf Sea Quarter 1 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| SWC-IBTS-4 |
Scotland Shelf Sea Q4 |
Scotland Shelf Sea Quarter 4 |
International Council for the Exploration of the Sea |
Europe |
Public |
https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx |
Included |
| WBLS |
Western Black Sea |
Western Black Sea |
Institute of Fish Resources, Bulgaria |
Europe |
Requires data request |
Elitsa Petrova (elitssa@yahoo.com), Feriha Tserkova & Vesselina
Mihneva |
Too few years |
| WCANN |
W Coast US |
West Coast USA |
National Oceanic and Atmospheric Administration |
USA |
Public |
DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and
OceanAdapt: https://zenodo.org/records/8103080 |
Included |
| ZAF-ATL |
Atlantic Ocean ZA |
Atlantic Ocean South Africa |
Department of Forestry, Fisheries and the Environment, South
Africa |
Africa |
Requires data request |
Tracey Fairweather traceyf@daff.gov.za |
Included |
| ZAF-IND |
Indian Ocean ZA |
Indian Ocean South Africa |
Department of Forestry, Fisheries and the Environment, South
Africa |
Africa |
Requires data request |
Tracey Fairweather traceyf@daff.gov.za |
Included |
FishGlob_1.5 <- fread(here::here("data","FISHGLOB_v1.5_clean.csv"))
|--------------------------------------------------|
|==================================================|
|--------------------------------------------------|
|==================================================|
This version of FishGlob leaves out seasons for GMEX, fix here
#add season to GMEX to survey unit
FishGlob_1.5[survey == "GMEX", survey_unit := paste0(survey,"-",season)]
Also adding in seasons for NIGFS
#add season to GMEX to survey unit
FishGlob_1.5[survey == "NIGFS", survey_unit := paste0(survey,"-",quarter)]
ZAF (South Africa) has distinct Atlantic and Indian surveys (split at
~20.01Ė E, Cape Agulhas)
FishGlob_1.5[survey == "ZAF" & longitude <20.01, survey_unit := "ZAF-ATL"][survey == "ZAF" & longitude >= 20.01, survey_unit := "ZAF-IND"]
Region names
sort(unique(FishGlob_1.5[,survey_unit]))
[1] "AI" "BITS-1" "BITS-4" "CHL" "COL" "DFO-HS" "DFO-NF" "DFO-QCS" "DFO-SOG" "DFO-WCHG" "DFO-WCVI" "EBS"
[13] "EVHOE" "FALK" "FR-CGFS" "GIN" "GMEX-Fall" "GMEX-Summer" "GOA" "GRL-DE" "GSL-N" "GSL-S" "ICE-GFS" "IE-IGFS"
[25] "IS-MOAG" "IS-TAU" "MEDITS" "MRT" "NAM" "NEUS-Fall" "NEUS-Spring" "NIGFS-1" "NIGFS-4" "Nor-BTS" "NS-IBTS-1" "NS-IBTS-3"
[37] "NZ-CHAT" "NZ-ECSI" "NZ-SUBA" "NZ-WCSI" "PT-IBTS" "ROCKALL" "S-GEORG" "SCS-FALL" "SCS-SPRING" "SCS-SUMMER" "SEUS-fall" "SEUS-spring"
[49] "SEUS-summer" "SWC-IBTS-1" "SWC-IBTS-4" "WBLS" "WCANN" "WCTRI" "ZAF" "ZAF-ATL" "ZAF-IND"
##Data Replacements ####Greenland (version in FishGlob 1.5 is missing
lengths and therefore biomass values) This version was obtained directly
from Karl-Michael Werner karl-michael.werner@thuenen.de
who now manages the Greenland survey September 2023. He is based in
Germany.
#greenland <-
####Norway Prepped by Laurene Pecuchet (U Trƶmso, Norway) September
2023 to replace whatās in FishGlob 1.5 because IMR āare quite concerned
that FishGlob, and other studies, have been using aāflawedā
multi-surveys dataset that is available in NMDC (data portal of IMR).
Turns out that this dataset was put publicly by miscommunication on NMDC
after one published paper in Scientific Reports, and I think they only
realized the existence of this dataset just the last year as some papers
are coming out using it (especially the one from Cesc Gordo-Vilaseca in
PNAS https://www.pnas.org/doi/10.1073/pnas.2120869120). They
are now trying to make some damage controls to make sure that this
dataset is not used ever again in the future, but that cleanded and
standardised datasets of the Barents Sea survey that are publicly
available in NMDC are used instead of.
September 14: From Laurene, āI send you in attachment the ānewā IMR
survey formatted for Fishglob. I have done some small check of the
dataset, and so far everything looks good, but I didnāt do a deep check
yet, but I donāt see why there should be any problems with itā¦.For your
study, I think it is also important that you know that there has been
some inconsistencies in taxonomic descriptions in the Barents Sea so
that some species should be considered at the genus level instead of for
biodiversity analysis, I send you in attach an excel (Barents Sea Fish
Reference List.csv) file that summarize which species might be a
misidentification and which one should be considered and merged.ā All of
these files now live in ādata/Norway_Sep2023ā
Helpful guidance from here: https://www.hi.no/en/hi/nettrapporter/rapport-fra-havforskningen-en-2021-15
- ā2.2.5 - Recommended adjustments to the output before analysis
Eelpouts and liparids. When combing years, we recommend that all records
of eelpouts (Zoarcidae) are pooled to the family level, because they are
notoriously difficult to identify (see Appendix 3). The same apply to
liparids (Liparidae). If species level data of these families are used,
consider excluding data from 2004-2006/2007. These years the staff on
some of the Norwegian vessels were inexperienced, and proper
identification keys for arctic species were lacking (compare for
instance catches of Lycodes frigidus and Lycodes eudipleurostictus in
the first years to the later years, Appendix 3). If species level data
of these families are used, records to family levels should be removed
or else these will be treated as a separate species in the further
analysis of the data. Both Zoarcidae and Liparidae have unresolved
taxonomy for some genera, therefore we have chosen to pool all liparids
of the genus Careproctus and all eelpouts of the genus Gymnelus in the
output. Sebastes. The columnā Sebastes spp.ā contains mainly juvenile
redfish. Small specimens are very difficult to identify so the protocol
is to identify only individuals larger than 10 cm to the species level.
Before analysis, all redfish ( S . mentella , S. norvegicus, S.
viviparus and Sebastes spp .) should be pooled, or Sebastes spp. should
be removed ā if not it will be treated as a separate species in the
analysis . Records in Appendix 2. The records of the S. viviparus west
of Svalbard(Spitsbergen) are unreliable and should be removed if
Sebastes data are kept at the species level (Appendix 2). Species
verified for the Barents Sea, but outliers in terms the normal depth
range, distribution area within the Barents Sea, size etc. were coded as
questionable in the data base (Appendix 2) and should be removed before
analysis. Consider also removing pelagic species (e.g.Ā capelin and
herring), as these are poorly sampled by the bottom trawl. The data
should be standardised with towing distance before analysis.ā
Therefore, we will: - Remove all records of eelpouts and liparids
(Family = Zoarcidae or Liparidae) (as we only include species IDād to
species) - Remove redfish (Genus = Sebastes)
#load Norwegian data
load(here::here("data","Norway_Sep2023","NOR-BTS_clean.RData"))
norway_clean <- data.table(data)
#remove observations without dates
norway_clean <- norway_clean[complete.cases(norway_clean[,.(month)]),]
#remove species records in accordance with recommendation from HI
norway_clean <- norway_clean[!(family %in% c("Zoarcidae","Liparidae") | genus == "Sebastes"),]
#some column names don't match fishglob (fishglob = num, num_h, num_cpue, wgt, wgt_h, wgt_cpue; norway = num, num_cpue (number of ind./hour), num_cpua (number of ind./km2), wgt, wgt_cpue (kg/min), wgt_cpua(kg/km2) )
#also, some column units in the readme are in correct. Therefore, I will generate _cpue and _h values here
# we will need to check and rename columns
setnames(norway_clean, c("haul_dur"), c("haul_dur_m"))
norway_clean[,haul_dur := haul_dur_m/60] #haul duration currently in minutes, need hours
norway_clean[,num_h := num/haul_dur][,num_cpue := num/area_swept][,wgt_h := wgt/haul_dur][,wgt_cpue := wgt/area_swept]
#change some columns to numeric
cols = c("month","day")
norway_clean[,(cols) := lapply(.SD,as.numeric),.SDcols = cols]
#also, delete source and timestamp
fishglob_colnames <- colnames(FishGlob_1.5)
norway_clean <- norway_clean[,..fishglob_colnames]
norway_clean[survey == "Nor-BTS" & month %in% c(1:6), survey_unit := "Nor-BTS-1"][survey == "Nor-BTS" & month %in% c(7:12), survey_unit := "Nor-BTS-3"]
#Overlap between IBTS and Nor-BTS surveys below 62Ėlatitude, so delete all hauls that occur below 62Ėlatitude
norway_clean <- norway_clean[latitude >= 62,]
Delete Greenland and Norway
FishGlob_1.5 <- FishGlob_1.5[!(survey %in% c("Nor-BTS"
#,
#"GRL-DE" #ignore greenland for now...
))]
Add in updated Greenland and Norway data
FishGlob_1.5 <-rbind(FishGlob_1.5,norway_clean)
#FishGlob_1.5 <-rbind(FishGlob_1.5,greenland)
##Preliminary Data Cuts ###Specific Regional Changes Before Cutting
to 10 years only
GSL - North: we have data 1980-2019, but gear changes in
2004/2005, so letās use later portion (more consistent months of
sampling; 2005-2019; 15 years) - South: we have data 1970-2019, but
gear/vessel changes in 1985 and again in 1992, so again letās use later
portion (1992-2019; 27 years) - See this github
issue
#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_GSL <- unique(FishGlob_1.5[(survey == "GSL-N" & year < 2005)|(survey == "GSL-S" & year < 1992),haul_id])
FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_GSL),] #remove hauls before consistent gear/vessel was used
SGEORG - From Martin Collins, āMost surveys were focused on
demersal fish on the South Georgia shelf (< 350 m), but surveys in
2003, 2010 and 2019 had some deeper trawls. The deeper trawls caught
very different fish, so are unlikely to be of use to a long-term
analysis, but I have left them in.ā
-Delete all trawls deeper than 350 M
haul_ids_to_remove_SGEORG <- unique(FishGlob_1.5[(survey == "SGEORG" & depth >350),haul_id])
FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_SGEORG),] #remove hauls before consistent gear/vessel was used
NZ-CHAT -bump december observations to next year because
observations occur in 12,1,2
#bump observations forward
FishGlob_1.5[survey == "NZ-CHAT" & month == 12, year := year+1, ]
###Because time is an essential component of these analyses, we will
get rid of any survey x season combinations that are not sampled for at
least 10 years
#new row for total number of years sampled
FishGlob_1.5[,years_sampled := length(unique(year)),.(survey_unit)]
summary(FishGlob_1.5$years_sampled) #ranges from 2 (DFO Straight of Georgia) to 57 (Northeast US)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 23.00 29.00 30.89 37.00 57.00
View(unique(FishGlob_1.5[,.(survey_unit, years_sampled)]))
#statistics about full dataset
nrow(FishGlob_1.5)
[1] 4172996
length(unique(FishGlob_1.5[,survey]))
[1] 45
length(unique(FishGlob_1.5[,survey_unit]))
[1] 57
#remove observations for any regions x season combinations sampled less than 10 times
FishGlob.10year <- FishGlob_1.5[years_sampled >= 10,]
#statistics about reduced 10 year dataset
nrow(FishGlob.10year)
[1] 4089112
length(unique(FishGlob.10year[,survey]))
[1] 38
length(unique(FishGlob.10year[,as.character(survey_unit)]))
[1] 48
#remove full database
rm(FishGlob_1.5)
###For taxonomic analyses, resolution to species is required.
Therefore, we will exclude any observations not resolved to species.
#month a number
FishGlob.10year[,month := as.numeric(month)]
FishGlob.10year.spp <- FishGlob.10year[rank %in% c("Species", "Subspecies"),] #3869384 total observations
#remove full species database
rm(FishGlob.10year)
#vector with all survey names
all_survey_units <- sort(unique(FishGlob.10year.spp[,survey_unit]))
#calculate # species per year
FishGlob.10year.spp_survey_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, accepted_name)])
FishGlob.10year.spp_survey_year[,spp_count_survey_year := uniqueN(accepted_name),.(survey_unit, year)]
FishGlob.10year.spp_survey_year.r <-unique(FishGlob.10year.spp_survey_year[,.(survey_unit, year, spp_count_survey_year)])
nrow(FishGlob.10year.spp_survey_year.r)
[1] 1215
#calculate # hauls per year
FishGlob.10year.spp_haulid_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, haul_id)])
FishGlob.10year.spp_haulid_year[,haulid_count_survey_year := uniqueN(haul_id),.(survey_unit, year)]
FishGlob.10year.spp_haulid_year.r <-unique(FishGlob.10year.spp_haulid_year[,.(survey_unit, year, haulid_count_survey_year)])
nrow(FishGlob.10year.spp_haulid_year.r)
[1] 1215
##Visually Inspect Distribution of Data Through Time and Space
##Spatial and Temporal Patterns in All Trawl Surveys
Letās look at the number of hauls per year/month and year/quarter and
year/season visually
#unique survey, survey_unit, year, month, quarter, season, haul_id, lat, lon
FishGlob.10year.uniquehauls <- unique(FishGlob.10year.spp[,.(survey, survey_unit, year,month,quarter,season,haul_id, latitude, longitude,haul_dur)])
#add column with adjusted longitude for few surveys that cross dateline (NZ-CHAT and AI)
FishGlob.10year.uniquehauls[,longitude_adj := ifelse((survey_unit %in% c("AI","NZ-CHAT") & longitude > 0),longitude-360,longitude)]
FishGlob.10year.uniquehauls[,haul_counts_per_survey_season_month :=uniqueN(haul_id),.(survey, month, season)][, #count # hauls per survey, season, and month
haul_counts_per_survey_quarter_month :=uniqueN(haul_id),.(survey, month, quarter)][,#count # hauls per survey, month, and quarter
total_hauls_survey :=uniqueN(haul_id),.(survey)][,#count # hauls per survey in all years
#proportion of hauls for each survey, season, and month divided by total # over all years
haul_proportion_survey_season :=haul_counts_per_survey_season_month/total_hauls_survey][,
#proportion of hauls for each survey, quarter, and month divided by total # over all years
haul_proportion_survey_quarter :=haul_counts_per_survey_quarter_month/total_hauls_survey][,
haul_count_per_survey_year_month :=uniqueN(haul_id),.(year, survey_unit, month)][, #count # hauls per survey unit, year, and month
total_hauls_survey_year := uniqueN(haul_id),.(survey_unit,year)][, #count total # hauls per survey unit and year
#proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
haul_proportion_month_yearly := haul_count_per_survey_year_month/total_hauls_survey_year][,
haul_count_per_survey_year_quarter :=uniqueN(haul_id),.(year, survey_unit, quarter)][, #count # hauls per survey unit, year, and month
#proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
haul_proportion_quarter_yearly := haul_count_per_survey_year_quarter/total_hauls_survey_year]
FishGlob.10year.uniquehauls.season <- unique(FishGlob.10year.uniquehauls[,.(survey, survey_unit, month, season, haul_counts_per_survey_season_month,total_hauls_survey, haul_proportion_survey_season)]) #relative sampling by season across all years
FishGlob.10year.uniquehauls.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey,survey_unit , month, quarter, haul_counts_per_survey_quarter_month,total_hauls_survey, haul_proportion_survey_quarter)]) #relative sampling by quarter across all years
FishGlob.10year.uniquehauls.annual.month <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, month, haul_count_per_survey_year_month,total_hauls_survey_year,haul_proportion_month_yearly)]) #relative sampling by month within years
FishGlob.10year.uniquehauls.annual.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, quarter, haul_count_per_survey_year_quarter,total_hauls_survey_year,haul_proportion_quarter_yearly)]) #relative sampling by month within years
#how does #hauls vary with season and month?
survey_season_month_hauls <- ggplot(FishGlob.10year.uniquehauls.season) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
facet_wrap(~survey,scales = "free_y") +
theme_classic()
ggsave(survey_season_month_hauls, filename = "survey_season_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")
#how does #hauls vary with quarter and month?
survey_quarter_month_hauls <- ggplot(FishGlob.10year.uniquehauls.quarter) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
facet_wrap(~survey,scales = "free_y") +
theme_classic()
ggsave(survey_quarter_month_hauls, filename = "survey_quarter_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")
#how does #hauls vary with year and month?
year_survey_month_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.month) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
facet_wrap(~survey_unit,scales = "free_y") +
theme_classic()
ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
#how does #hauls vary with year and month?
year_survey_quarter_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.quarter) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
facet_wrap(~survey_unit,scales = "free_y") +
theme_classic()
ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
Now, letās look at how location of sampling varies by month of
sampling and year of sampling
location_by_year <- ggplot(FishGlob.10year.uniquehauls) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
facet_wrap(~survey_unit, scales = "free") +
theme_classic()
ggsave(location_by_year, filename = "location_by_year.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
ggsave(location_by_year, filename = "location_by_year.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
ggsave(location_by_year, filename = "location_by_year.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
(location_by_month <- ggplot(FishGlob.10year.uniquehauls) +
geom_point(aes(x = longitude_adj, y = latitude, color = as.numeric(month)), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
facet_wrap(~survey_unit, scales = "free") +
theme_classic())
ggsave(location_by_month, filename = "location_by_month.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
ggsave(location_by_month, filename = "location_by_month.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
ggsave(location_by_month, filename = "location_by_month.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")


##Region Specific Data Processing
-Fredston et al.Ā 2022 Nature and Batt et al.Ā 2017 Ecology Letters
informed North American data processing -Personal communication with
Aurore Maureaud and Laurene Pecuchet re: work by A. Maureaud, L.
Pecuchet and R. Frelat and the supplementary material for Maureaud et
al.Ā 2019 Proceedings of the Royal Society B: Biological Sciences
informed European data processing -Additional data processing informed
by data itself, and by FishGlob pdf summary documents -limit to max 3
months for each survey unit, representative of a āseasonā (exception =
West Coast USA where all 4 months sampled consistently)
####āAIā
ggplot(FishGlob.10year.uniquehauls.season[survey == "AI",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey == "AI",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey == "AI",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey == "AI",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "AI",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "AI",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

- Most hauls in 6,7,8
- Seemingly consistent spatial distribution through time
- No dramatic changes in spp richness
ai_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "AI" & month %in% c(6:8),haul_id])
####BITS (We have two surveys for BITS, quarter 1 and quarter 4) BITS
1
From Fredston et al.Ā 2023, every year after 2000 has >400 hauls
and most of the earlier years are <50
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-1",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-1",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-1",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-1",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-1",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-1",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep both months (2,3) -Seemingly consistent spatial distribution
through time -Consistent # of species and # hauls after 2000
bits1_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-1" & month %in% c(2,3) & year > 2000,haul_id])
BITS4
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-4",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-4",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-4",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-4",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-4",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-4",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (10,11,12) -Start in 2000 (starts in 1996, but gap in 1997 and
1998, and 1996 all in December; also spp richness in first survey very
low; consistent # of hauls after 2000) -Seemingly consistent spatial
distribution through time
bits4_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-4" & month %in% c(10:12) & year > 2000,haul_id])
####CHL (Chile)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "CHL",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "CHL",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "CHL",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "CHL",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "CHL",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "CHL",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (7,8,9) -Seemingly consistent spatial distribution through time
-No major changes in spp richness through time -No major changes in #
hauls through time
chl_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "CHL" & month %in% c(7:9),haul_id])
####DFO-NF
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-NF",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-NF",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-NF",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-NF",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-NF",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-NF",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through
time -No major changes in spp richness through time -No major changes in
haulid through time
dfo_nf_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF" & month %in% c(10:12),haul_id])
####DFO-QCS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-QCS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-QCS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-QCS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-QCS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (7,8) -Seemingly consistent spatial distribution through time
-No major changes in richness over time -No major changes in #hauls
dfo_qcs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS" & month %in% c(7,8),haul_id])
####EBS
-Sampling years prior to 1984 (data begin in 1982) were excluded from
analysis due to large apparent increases in the number of species
recorded in the first two years. (Batt et al.Ā 2017)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EBS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EBS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EBS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EBS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EBS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EBS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (6,7,8) -Seemingly consistent spatial distribution through time
-Per Batt et al.Ā 2017, limit to >= 1984 -No clear changes in richness
through time -No clear changes in # hauls through time
ebs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EBS" & month %in% c(6,7,8) & year >= 1984,haul_id])
####EVHOE
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EVHOE",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EVHOE",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EVHOE",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EVHOE",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EVHOE",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EVHOE",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through
time -Very low sampling in 2017 (and also low richness), exclude this
year
evhoe_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EVHOE" & month %in% c(10,11,12) & year != 2017 ,haul_id])
####FALK (excluded from final dataset)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FALK",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FALK",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FALK",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FALK",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FALK",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FALK",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep February (2) only from 2004 onward (most consistent sampling)
-Inconsistent spatial distribution through time, but this will be fixed
in next step with spatial standardization
falk_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FALK" & month %in% c(2) & year >= 2004, haul_id])
####FR-CGFS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FR-CGFS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FR-CGFS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FR-CGFS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FR-CGFS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 9,10,11 -Consistent spatial distribution through time
-Seemingly consistent richness through time -Seeemingly consistent
#hauls through time
fr_cgfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS" & month %in% c(9,10,11), haul_id])
####GIN (excluded from final dataset)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GIN",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GIN",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GIN",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GIN",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GIN",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GIN",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Exclude this region, no consistent sampling through time
gin_hauls_keep <- NULL
####GMEX -In the Gulf of Mexico, we restricted our analysis to data
from 1984 - 2000 (full range 1982-2014); if all years had been used, the
number of sites sampled in at least 85% of years would drop from 39 to
13. (Batt et al.Ā 2017)
GMEX Fall
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Fall",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Fall",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Fall",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Fall",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 9,10,11 -Inconsistent spatial distribution through time, will
restrict to <-87.5 longitude -Seemingly consistent richness through
time -Seeemingly consistent #hauls through time
gmex_fall_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall" & month %in% c(9,10,11) & longitude_adj < -87.5, haul_id])
GMEX Summer
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Summer",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Summer",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Summer",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Summer",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep months 5,6,7 -In consistent spatial distribution through time,
but this will be fixed in spatial standardization step -Seemingly
consistent richness before 2008 and 2008 onward through time -Seeemingly
consistent #hauls through time -Jump from 2007 to 2008, when spatial
footprint increases, so I will only use data from before 2008
gmex_summer_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer" & month %in% c(5,6,7) & year <2008, haul_id])
####GOA
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GOA",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GOA",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GOA",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GOA",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GOA",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GOA",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep months 6,7,8 -Consistent spatial distribution through time
-Seemingly consistent richness -Seemingly consistent #hauls through
time
goa_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GOA" & month %in% c(6,7,8), haul_id])
####GRL-DE -From Beukhof et al.Ā 2019, all surveys in October and
November
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GRL-DE",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GRL-DE",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GRL-DE",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GRL-DE",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GRL-DE",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GRL-DE",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-No months in data set, but according to Beukhof et al.Ā 2019, all
sampling in October and November so keep all -Consistent spatial
distribution through time -Seemingly consistent richness -# of hauls
drops between 1991 and 1992, and both 1992 and 2017 so limit to years
between (1993-2016)
grl_de_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE" & year %in% c(1993:2016), haul_id])
####GSL
GSL-N
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-N",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-N",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-N",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-N",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-N",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-N",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 6,7,8 -Consistent spatial distribution through time -Seemingly
consistent richness -# of hauls in 2005 is higher, so start in 2006
gsl_n_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-N" & year > 2005, haul_id])
GSL-S
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-S",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-S",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-S",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-S",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-S",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-S",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 8,9,10 -Consistent spatial distribution through time -Seemingly
consistent richness -Seemingly consistent number of hauls
gsl_s_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-S" & month %in% c(8:10), haul_id])
####ICE-GFS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ICE-GFS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ICE-GFS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ICE-GFS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ICE-GFS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 2,3,4 -Consistent spatial distribution through time -Seemingly
consistent richness -Seemingly consistent number of hauls
ice_gfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS" & month %in% c(2:4), haul_id])
####IE-IGFS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IE-IGFS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IE-IGFS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IE-IGFS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IE-IGFS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 10,11,12 -Consistent spatial distribution through time after
2004 (sampled far east in 2003 and 2004) -Seemingly consistent richness
-Seemingly consistent number of hauls
ie_igfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS" & month %in% c(10:12) & year > 2004, haul_id])
####IS-MOAG (excluded from final dataset)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IS-MOAG",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IS-MOAG",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IS-MOAG",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IS-MOAG",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Sampling too scattered over time, excluding
is_moag_hauls_keep <- NULL
####MEDITS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MEDITS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MEDITS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MEDITS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MEDITS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MEDITS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MEDITS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep all surveys in quarter 2 -Consistent spatial distribution
through time -Seemingly consistent richness -Seemingly consistent number
of hauls
medits_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "MEDITS", haul_id])
####MRT (excluded from final dataset)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MRT",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MRT",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MRT",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MRT",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MRT",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MRT",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Sampling inconsistent, exclude completely
mrt_hauls_keep <- NULL
####NAM
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NAM",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NAM",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NAM",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NAM",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NAM",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NAM",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep surveys in 1 and 2 (most consistently sampled) -Consistent
spatial distribution through time -Seemingly consistent richness except
for 1998 (exclude) -Seemingly consistent number of hauls except for 1998
(exclude)
nam_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NAM" & month %in% c(1,2) & year != 1998, haul_id])
####NEUS
NEUS Spring
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Spring",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Spring",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Spring",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Spring",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 3,4,5 months -Inconsistent spatial distribution through time,
but should be caught in standardization step -Seemingly consistent
richness (especially after 87, should be fixed with standardization
step) -Seemingly consistent number of hauls (especially after 81, should
be fixed with standardization step)
#calculate wgt_cpue (km^2 avg from sean Lucey) and wgt_h (all biomass values calibrated to standard pre 2009 30 minute tow)
FishGlob.10year.spp[survey == "NEUS", wgt_h := wgt/0.5][survey == "NEUS", wgt_cpue := wgt/0.0384][survey == "NEUS", num_h := num/0.5][survey == "NEUS", num_cpue := num/0.0384]
#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_spring_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Spring" & month %in% c(3:5) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
(survey_unit == "NEUS-Spring" & month %in% c(3:5) & year >= 2009 & (haul_dur > 0.25 & haul_dur < 0.42))), haul_id])
NEUS Fall
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Fall",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Fall",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Fall",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Fall",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 9,10,11 months -Inconsistent spatial distribution through time,
but should be caught in standardization step -Seemingly consistent
richness (especially after 84, should be fixed with standardization
step) -Seemingly consistent number of hauls (especially after 85, should
be fixed with standardization step)
#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_fall_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
(survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year >= 2009 & (haul_dur > 0.25 & haul_dur < 0.42))), haul_id])
####NIGFS Northern Ireland
Spring Northern Ireland (quarter 1)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-1",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-1",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-1",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-1",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 2,3,4 months -Inconsistent spatial distribution through time,
but should be caught in standardization step -Seemingly consistent
richness -Seemingly consistent number of hauls
nigfs_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1" & month %in% c(2,3,4), haul_id])
Spring Northern Ireland (quarter 1)
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-4",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-4",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-4",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-4",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Keep 10,11 months -Consistent spatial distribution through time, but
should be caught in standardization step -Seemingly consistent richness
-Seemingly consistent number of hauls
nigfs_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4" & month %in% c(10,11), haul_id])
####Nor-BTS
OG FISHGLOB includes Nor-BTS-1 as well, but this was not shared by L.
Pecuchet, and therefore ignored
Nor-BTS-3
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "Nor-BTS-3",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "Nor-BTS-3",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "Nor-BTS-3",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "Nor-BTS-3",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 8,9,10 -Somewhat consistent spatial distribution through
time -Number of hauls is variable, but no clear years to exclude
-Laurene Pecuchet (U Tromso) told us that only surveys 2004 and onwards
work for biodiversity analyses
nor_bts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3" & month %in% c(8:10) & year >= 2004, haul_id])
####NS-IBTS
NS-IBTS-1
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-1",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-1",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-1",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-1",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 1,2,3 -Consistent spatial distribution through time
-Linear increase in richness, cutoff on # hauls more clear -Linear
increase, but somewhat clear break between late 70s and mid-80s, only
keep hauls after 1984
ns_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1" & month %in% c(1:3) & year >= 1984, haul_id])
NS-IBTS-3
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-3",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-3",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-3",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-3",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 7,8,9 -Consistent spatial distribution through time
-Consistent richness through time -Early years lower # hauls, will start
at 1998
ns_ibts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3" & month %in% c(7:9) & year >= 1998, haul_id])
####NZ
NZ-CHAT
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-CHAT",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-CHAT",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-CHAT",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-CHAT",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 12,1,2 (NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO WE
ALREADY LUMPED 12 with NEXT year) -Consistent spatial distribution
through time -Seemingly consistent richness -Seemingly consistent number
of hauls after 1995
nz_chat_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT" & month %in% c(12,1,2) & year >= 1995, haul_id])
NZ-ECSI
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-ECSI",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-ECSI",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-ECSI",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-ECSI",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time
-Seemingly consistent richness -Seemingly consistent number of hauls
-Gap between 1995 and 2005, but we have 10 total years so weāll keep for
now
nz_ecsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI" & month %in% c(4,5,6), haul_id])
NZ-SUBA
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-SUBA",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-SUBA",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-SUBA",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-SUBA",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 11 and 12 -Consistent spatial distribution through time
-Seemingly consistent richness -Far more hauls in 1990s, these early
sampling years will be excluded (start in 2000)
nz_suba_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA" & month %in% c(11,12) & year >= 2000, haul_id])
NZ-WCSI
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-WCSI",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-WCSI",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-WCSI",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-WCSI",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 3,4 -Consistent spatial distribution through time
-Seemingly consistent richness -Linear decrease in # of hauls through
time, leave out first two years with highest # hauls (>= 1995)
nz_wcsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI" & month %in% c(3,4) & year >= 1995, haul_id])
####PT-IBTS PT-IBTS
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "PT-IBTS",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "PT-IBTS",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "PT-IBTS",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "PT-IBTS",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time
-Seemingly consistent richness -Seemingly consistent number of hauls
pt_ibts_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS" & month %in% c(9,10,11), haul_id])
####ROCKALL
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ROCKALL",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ROCKALL",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ROCKALL",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ROCKALL",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ROCKALL",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ROCKALL",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 8,9 -Consistent spatial distribution through time
-Seemingly consistent richness -Seemingly consistent number of hauls
rockall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL" & month %in% c(8,9), haul_id])
####S-GEORG
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "S-GEORG",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "S-GEORG",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "S-GEORG",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "S-GEORG",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "S-GEORG",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "S-GEORG",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 1 and 2 -Consistent spatial distribution through time
-Seemingly consistent richness except for 2003, will be excluded
-Seemingly consistent number of hauls, except for 2012, will be
excluded
s_georg_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG" & month %in% c(1,2) & !(year %in% c(2003,2012)), haul_id])
####SCS
Spring
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SPRING",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SPRING",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SPRING",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SPRING",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 2,3,4 -Inconsistent spatial distribution through time
(northern latitudes only sampled in early years), only include
longitudes < -62 and latitudes < 45.5 -Seemingly consistent
richness -Number of hauls is variable, exclude super low and high
numbers (1985,1994,2015,2019)
scs_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING" & month %in% c(2,3,4) & !(year %in% c(1985,1994,2015,2019)) & longitude_adj < -62 & latitude < 45.5, haul_id])
SUMMER
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SUMMER",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SUMMER",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SUMMER",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SUMMER",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 6,7,8 -Consistent spatial distribution through time
-Richness increases linearly, not a clear break point, using breakpoint
from # of hauls, but will exclude 2010 which has a very high richness -#
Hauls increases linearly from ~120 in 1970 to ~220 in 2020, not a clear
breakpoint, but will go with 1986 because there is a jump between 85 and
86 -Gear change in 1983 (Ellingsen et al.Ā 2015)
scs_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER" & month %in% c(6,7,8) & year >= 1986 & year != 2010, haul_id])
###SEUS
Spring
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-spring",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-spring",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-spring",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-spring",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time
-Consistent richness through time -# Hauls low in 1989 and 2018, will
exclude
seus_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring" & month %in% c(4,5,6) & year != 1989 & year != 2018, haul_id])
Summer
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-summer",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-summer",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-summer",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-summer",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 7,8 -Consistent spatial distribution through time
-Richness consistent through time -# Hauls low in first year, otherwise
okay, just exclude first year (1989)
seus_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer" & month %in% c(7,8) & year != 1989, haul_id])
Fall
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-fall",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-fall",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-fall",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-fall",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time
-Richness consistent through time -# Hauls low in first year, otherwise
okay, just exclude first year (1989)
seus_fall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall" & month %in% c(9,10,11) & year != 1989, haul_id])
####SWC-IBTS
Scotland Shelf Sea
SWC-IBTS 1
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-1",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-1",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-1",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-1",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 1,2,3 -Somewhat inconsistent spatial distribution through
time, but this should be addressed in spatial standardization procedure
-Richness consistent through time -# Hauls consistent except low in
1995, just exclude 1995
swc_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1" & month %in% c(1,2,3) & year != 1995, haul_id])
SWC-IBTS 4
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-4",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-4",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-4",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-4",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Use months 10,11,12 -Somewhat inconsistent spatial distribution
through time (southern latitudes only sampled in early years), but this
should be addressed in spatial standardization procedure -Richness
consistent through time (especially after mid 90s) -# Hauls consistent
except low before 1995 and low in 2013, exclude these
swc_ibts_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4" & month %in% c(10,11,12) & year != 1995 & year >= 1995, haul_id])
####WCANN
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "WCANN",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "WCANN",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "WCANN",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "WCANN",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "WCANN",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "WCANN",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Here, one exception, will use four months (6,7,8,9) because all
sampled consistently, and lower latitude areas sampled later in the
summer consistently -Consistent spatial distribution through time
-Richness consistent through time -# Hauls consistent through time
wcann_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "WCANN" & month %in% c(6:9), haul_id])
####WCTRI -Exclude because only 10 years and overlaps somewhat wiith
WCANN
wctri_keep <- NULL
####ZAF
ATL
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-ATL",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-ATL",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-ATL",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-ATL",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Include 1,2,3 -Consistent spatial distribution through time
-Richness consistent through time -# Hauls consistent through time after
1991
zaf_atl_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL" & month %in% c(1:3) & year >= 1991, haul_id])
IND
ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-IND",]) +
geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-IND",]) +
geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
scale_fill_viridis() +
labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-IND",]) +
geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-IND",]) +
geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
scale_fill_viridis() +
labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
scale_color_viridis() +
theme_classic()

ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
scale_color_viridis(option = "plasma") +
theme_classic()

# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=spp_count_survey_year)) +
geom_col() +
theme_classic()

# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=haulid_count_survey_year)) +
geom_col() +
theme_classic()

-Include 4,5,6 -Consistent spatial distribution through time
-Richness consistent through time -# Hauls consistent before 2001, and
then also in 2005 and 2009-2010
zaf_ind_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND" & month %in% c(4:6) & year %in% c(1985:2001,2005, 2009,2010), haul_id])
####Combine all lists that have _keep
#all objects with _keep
list_obj <- ls(pattern = "_keep")
#combine
fishglob_haulids_to_keep <- unlist(lapply(list_obj, get)) #229894 hauls (Started with 278405)
FishGlob.10year.spp_manualclean <- FishGlob.10year.spp[haul_id %in% fishglob_haulids_to_keep,]
#Require latitude and longitude for all observations
FishGlob.10year.spp_manualclean <- FishGlob.10year.spp_manualclean[complete.cases(FishGlob.10year.spp_manualclean[,.(latitude, longitude)])] #check that this works
#another check for # years sampled
#new row for total number of years sampled
FishGlob.10year.spp_manualclean[,years_sampled := length(unique(year)),.(survey_unit)]
View(unique(FishGlob.10year.spp_manualclean[,.(survey_unit, years_sampled)]))
#save
saveRDS(FishGlob.10year.spp_manualclean, file = here::here("data","cleaned","FishGlob.10year.spp_manualclean.rds"))
####Some surveys sample through end of year, fix these -NOTE THAT
THIS NZ-CHAT SURVEY CROSSES YEAR, SO LUMP 1 and 2 with previous year
LS0tCnRpdGxlOiAiUHJlcGFyZSBGaXNoR2xvYiBEYXRhc2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBab8OrIEouIEtpdGNoZWwKZGF0ZTogT2N0b2JlciAxMSwgMjAyMwotLS0KClNjcmlwdCAxIGZvciBLaXRjaGVsIGV0IGFsLiAyMDIzIGluIHByZXAgdGF4b25vbWljIGRpdmVyc2l0eSBtYW51c2NyaXB0LgoKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCiNsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJhc3RlclZpcykKbGlicmFyeShjb25jYXZlbWFuKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZGF0YS50YWJsZSkKc2V0LnNlZWQoMSkKCmBgYAoKUHVsbCBpbiBjb21waWxlZCBhbmQgY2xlYW5lZCBkYXRhIGZyb20gRmlzaEdsb2IgZG93bmxvYWRlZCBvbiBOb3ZlbWJlciAyOCAyMDIyIChWIDEuNSkuIFRoaXMgaXMgdHlwaWNhbGx5IGNvbXBpbGVkIGJ5IERyLiBBdXJvcmUgTWF1cmVhdWQuIFRoaXMgaW5jbHVkZXMgcHVibGljIGFuZCBwcml2YXRlIGRhdGEgYW5kIHRoZXJlZm9yZSBsaW5rIGNhbm5vdCBiZSBzaGFyZWQuIEhvd2V2ZXIgd2l0aCBlZGl0aW5nIHlvdSBjYW4gcnVuIGFuYWx5c2VzIGZvciBwdWJsaWMgdHJhd2wgc3VydmV5cy4KCnxTdXJ2ZXkgY29kZXxTdXJ2ZXkgbmFtZSBzaG9ydHxTdXJ2ZXkgbmFtZSBsb25nfEFnZW5jeXxSZWdpb258QWNjZXNzfFByb3ZpZGVyL2xpbmsgdG8gYWNjZXNzfEluY2x1c2lvbgp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfEFJICB8QWxldXRpYW4gSXNsYW5kc3xBbGV1dGlhbiBJc2xhbmRzfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8QklUUy0xICB8QmFsdGljIFNlYSBRMXxCYWx0aWMgU2VhIFF1YXJ0ZXIgMXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxCSVRTLTQgIHxCYWx0aWMgU2VhIFE0fEJhbHRpYyBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfENITCAgfENoaWxlfENoaWxlfFVuaXZlcnNpZGFkIGRlIENvbmNlcGNpw7NuLCBDaGlsZXxTb3V0aCBBbWVyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxEYW5pZWxhIFllcHNvbiBkYW5pZWxhLnllcHNlbkBnbWFpbC5jb20gYW5kIEx1aXMgQ3ViaWxsb3MgbHVjdWJpbGxvc0BnbWFpbC5jb218SW5jbHVkZWR8CnxDT0x8IENvbG9tYmlhfCBDb2xvbWJpYW4gQ2FyaWJiZWFufFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhfFNvdXRoIEFtZXJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fENhbWlsbyBCLiBHYXJjaWEgY2JnYXJjaWFyQHVuYWwuZWR1LmNvfFRvbyBmZXcgeWVhcnN8CnxERk8tSFMgIHxIZWNhdGUgU3RyYWl0fEhlY2F0ZSBTdHJhaXR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0Lzc4MGExYzAyLTFmOWMtNDk5NC1iYzcwLWEwZTllZjhlMzk2OCBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxUb28gZmV3IHllYXJzfAp8REZPLU5GICB8TmV3Zm91bmRsYW5kfE5ld2ZvdW5kbGFuZHxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfCBDYW5hZGF8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1hcmlhbm8gS29lbi1BbG9uc28gbWFyaWFuby5rb2VuLWFsb25zb0BkZm8tbXBvLmdjLmNhfEluY2x1ZGVkfAp8REZPLVFDUyAgfFF1ZWVuIENoYXJsb3R0ZSBTb3VuZHxRdWVlbiBDaGFybG90dGUgU291bmR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0L2EyNzhkMWFmLWQ1NjctNDk2NC1hMTA5LWFlMWU4NGNiZDI0YSBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfERGTy1TT0cgIHxTdHJhaXQgb2YgR2VvcmdpYXxTdHJhaWdodCBvZiBHZW9yZ2lhfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9kODgwYmExOC04NzkwLTQxYTItYmY3My1lOTI0NzM4MDc1OWIgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxERk8tV0NIRyAgfFdlc3QgQ29hc3QgSGFpZGEgR3dhaWl8V2VzdCBDb2FzdCBIYWlkYSBHd2FpaXxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvNWVlMzA3NTgtYjFkNi00OWZlLThjNGUtNTEzNmY0YjM5YWQxIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfCBUb28gZmV3IHllYXJzfAp8REZPLVdDVkkgIHxXZXN0IENvYXN0IFZhbmNvdXZlciBJc2xhbmR8V2VzdCBDb2FzdCBWYW5jb3V2ZXIgSXNsYW5kfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC81NTdlNDJhZS0wNmZlLTQyNmQtODI0Mi1jMzEwNzY3MGIxZGUgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxFQlMgIHxFYXN0ZXJuIEJlcmluZyBTZWF8RWFzdGVybiBCZXJpbmcgU2VhfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8RVZIT0UgIHxCYXkgb2YgQmlzY2F5fEJheSBvZiBCaXNjYXl8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8RkFMSyAgfEZhbGtsYW5kIElzbGFuZHN8RmFsa2xhbmQgSXNsYW5kc3xGYWxrbGFuZCBJc2xhbmRzIEZpc2hlcmllcyBEZXBhcnRtZW50fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxBbGV4YW5kZXIgQXJraGlwa2luIGFhcmtoaXBraW5AZmlzaGVyaWVzLmdvdi5mayBhbmQgSm9yZ2UgUmFtb3MgamVyYW1vc0BmaXNoZXJpZXMuZ292LmZrfCBFeGNsdWRlZCBhZnRlciBzcGF0aWFsIHRlbXBvcmFsIHN0YW5kYXJkaXphdGlvbiBpbiBuZXh0IHNjcmlwdHwKfEZSLUNHRlMgIHxFbmdsaXNoIENoYW5uZWx8RW5nbGlzaCBDaGFubmVsfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfEdJTiAgfEd1aW5lYXxHdWluZWF8TmF0aW9uYWwgQ2VudGVyIG9mIEZpc2hlcmllcyBTY2llbmNlcyBvZiBCb3Vzc291cmEsIENvbmFrcnksIFJlcHVibGljIG9mIEd1aW5lYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1vaGFtbWVkIExhbWluZSBDYW1hcmEgbWxjYW1hcmEua2VubmVkeUBnbWFpbC5jb218SW5jb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggc3BhY2UgYW5kIHRpbWV8CnxHTUVYLVN1bW1lciAgfEd1bGYgb2YgTWV4aWNvIFN1bW1lcnxHdWxmIG9mIE1leGljbyBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHTUVYLUZhbGwgIHxHdWxmIG9mIE1leGljbyBGYWxsfEd1bGYgb2YgTWV4aWNvIEZhbGx8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHT0EgIHxHdWxmIG9mIEFsYXNrYXxHdWxmIG9mIEFsYXNrYXxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfEdSTC1ERSAgfEdyZWVubGFuZHxHcmVlbmxhbmR8VGh1ZW5lbiBJbnN0aXR1dGUgb2YgU2VhIEZpc2hlcmllc3xFdXJvcGV8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fEthcmwtTWljaGFlbCBXZXJuZXIga2FybC1taWNoYWVsLndlcm5lckB0aHVlbmVuLmRlfEluY2x1ZGVkfAp8R1NMLU4gIHxOIEd1bGYgb2YgU3QuIExhd3JlbmNlfE5vcnRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xTZWUgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MCBmb3Igc3BlY2lmaWMgREZPIGxpbmtzfEluY2x1ZGVkfAp8R1NMLVMgIHxTIEd1bGYgb2YgU3QuIExhd3JlbmNlfFNvdXRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xOTg5ZGUzMi1iYzVkLWM2OTYtODc5Yy01NGQ0MjI0MzhlNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxJQ0UtR0ZTICB8SWNlbGFuZHxJY2VsYW5kfE1hcmluZSBhbmQgRnJlc2h3YXRlciBSZXNlYXJjaCBJbnN0aXR1dGUsIEljZWxhbmR8RXVyb3BlfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKw7NuIFPDs2xtdW5kc3NvbiBqb24uc29sbXVuZHNzb25AaGFmb2d2YXRuLmlzfEluY2x1ZGVkfAp8SUUtSUdGUyAgfElyaXNoIFNlYXxJcmlzaCBTZWF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8SVMtVEFVfCBJc3JhZWwgfCBJc3JhZWx8IFRlbCBBdml2IFVuaXZlcnNpdHl8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8IEpvbmF0aGFuIEJlbG1ha2VyIGpvbmF0aGFuLmJlbG1ha2VyQGdtYWlsLmNvbXxUb28gZmV3IHllYXJzfAp8SVMtTU9BR3xJc3JhZWx8SXNyYWVsfElzcmFlbGkgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmV8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8T3JlbiBTb25pbiBvcmVuc0Btb2FnLmdvdi5pbCBhbmQgRG9yaSBFZGVsaXN0IGJsYWNrcmVlZnNAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TUVESVRTICB8TWVkaXRlcnJhbmVhbnxNZWRpdGVycmFuZWFufE11bHRpcGxlfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8Q29udGFjdCBjb3JyZXNwb25kaW5nIGF1dGhvciBmb3IgY29udGFjdHN8SW5jbHVkZWR8CnxNUlR8TWF1cml0YW5pYXxNYXVyaXRhbmlhfEluc3RpdHV0IE1hdXJpdGFuaWVuIGRlIFJlY2hlcmNoZXMgT2PDqWFub2dyYXBoaXF1ZXMgZXQgZGVzIFDDqmNoZXMsIE5vdWFkaGlib3UsIE1hdXJpdGFuaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxCZXlhaCBNZWlzc2EgYm1vdWxkaGFiaWJAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TkFNICB8TmFtaWJpYXxOYW1pYmlhfE5hdGlvbmFsIE1hcmluZSBJbmZvcm1hdGlvbiBhbmQgUmVzZWFyY2ggQ2VudHJlLCBNaW5pc3RyeSBvZiBGaXNoZXJpZXMgYW5kIE1hcmluZSBSZXNvdXJjZXMsIE5hbWliaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKb2hhbm5lcyBLYXRoZW5hIGpvaG4ua2F0aGVuYUBtZm1yLmdvdi5uYXxJbmNsdWRlZHwKfE5FVVMtRmFsbCAgfE5FIFVTIEZhbGx8Tm9ydGhlYXN0IFVTQSBGYWxsfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8TkVVUy1TcHJpbmcgIHxORSBVUyBTcHJpbmd8Tm9ydGhlYXN0IFVTQSBTcHJpbmd8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxOSUdGUy0xICB8TiBJcmVsYW5kIFExfE5vcnRoIElyZWxhbmQgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5JR0ZTLTQgIHxOIElyZWxhbmQgUTR8Tm9ydGggSXJlbGFuZCBRdWFydGVyIDR8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8Tm9yLUJUUy0zICB8QmFyZW50cyBTZWEgTm9yd2F5IFEzfEJhcmVudHMgU2VhIE5vcndheSBRM3xJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxOUy1JQlRTLTEgIHxOIFNlYSBRMXxOb3J0aCBTZWEgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5TLUlCVFMtMyAgfE4gU2VhIFEzfE5vcnRoIFNlYSBRdWFydGVyIDN8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8TlotQ0hBVCAgfENoYXRoYW0gUmlzZSBOWnxDaGF0aGFtIFJpc2UgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1FQ1NJICB8RSBDb2FzdCBTIElzbGFuZCBOWnxFYXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfE5aLVNVQkEgIHxTdWItQW50YXJjdGljIE5afFN1Yi1BbnRhcmN0aWMgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1XQ1NJICB8VyBDb2FzdCBTIElzbGFuZCBOWnxXZXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfFBULUlCVFMgIHxQb3J0dWdhbHxQb3J0dWdhbHxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxST0NLQUxMICB8Um9ja2FsbCBQbGF0ZWF1fFJvY2thbGwgUGxhdGVhdXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxTLUdFT1JHICB8UyBHZW9yZ2lhfFNvdXRoIEdlb3JnaWF8QnJpdGlzaCBBbnRhcmN0aWMgU3VydmV5fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxNYXJrIEJlbGNoaWVyIG1hcmsuYmVsY2hpZXJAZ292LmdzIGFuZCBNYXJ0aW4gQ29sbGlucyBtYWNvbEBiYXMuYWMudWt8SW5jbHVkZWR8CnxTQ1MtRmFsbCAgfFNjb3RpYW4gU2hlbGYgRmFsbHxTY290aWFuIFNoZWxmIFN1bW1lcnxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvMTM2NmUxZjEtZTJjOC00OTA1LTg5YWUtZTEwZjFiZTBhMTY0IGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfFRvbyBmZXcgeWVhcnN8SW5jbHVkZWR8CnxTQ1MtU1BSSU5HICB8U2NvdGlhbiBTaGVsZiBTcHJpbmd8U2NvdGlhbiBTaGVsZiBTcHJpbmd8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3wgQ2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9mZWNmMDQ1YS05NWEyLTRiNjktOGE0MC04MTg2NDlhNjI3MTYgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8VG9vIG11Y2ggZGF0YSBsb3NzIGFmdGVyIHNwYXRpYWwgdGVtcG9yYWwgc3RhbmRhcmRpemF0aW9ufAp8U0NTLVNVTU1FUiAgfFNjb3RpYW4gU2hlbGYgU3VtbWVyfFNjb3RpYW4gU2hlbGYgU3VtbWVyfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xMzY2ZTFmMS1lMmM4LTQ5MDUtODlhZS1lMTBmMWJlMGExNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTRVVTLWZhbGwgIHxTRSBVUyBGYWxsfFNvdXRoZWFzdCBVU0EgRmFsbHxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfFNFVVMtc3ByaW5nICB8U0UgVVMgU3ByaW5nfFNvdXRoZWFzdCBVU0EgU3ByaW5nfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8U0VVUy1zdW1tZXIgIHxTRSBVUyBTdW1tZXJ8U291dGhlYXN0IFVTQSBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTV0MtSUJUUy0xICB8U2NvdGxhbmQgU2hlbGYgU2VhIFExfFNjb3RsYW5kIFNoZWxmIFNlYSBRdWFydGVyIDF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8U1dDLUlCVFMtNCAgfFNjb3RsYW5kIFNoZWxmIFNlYSBRNHxTY290bGFuZCBTaGVsZiBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfFdCTFN8IFdlc3Rlcm4gQmxhY2sgU2VhfCBXZXN0ZXJuIEJsYWNrIFNlYXxJbnN0aXR1dGUgb2YgRmlzaCBSZXNvdXJjZXMsIEJ1bGdhcmlhfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8RWxpdHNhIFBldHJvdmEgKGVsaXRzc2FAeWFob28uY29tKSwgRmVyaWhhIFRzZXJrb3ZhICYgVmVzc2VsaW5hIE1paG5ldmF8IFRvbyBmZXcgeWVhcnN8CnxXQ0FOTiAgfFcgQ29hc3QgVVN8V2VzdCBDb2FzdCBVU0F8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxaQUYtQVRMICB8QXRsYW50aWMgT2NlYW4gWkF8QXRsYW50aWMgT2NlYW4gU291dGggQWZyaWNhfERlcGFydG1lbnQgb2YgRm9yZXN0cnksIEZpc2hlcmllcyBhbmQgdGhlIEVudmlyb25tZW50LCBTb3V0aCBBZnJpY2F8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHwgVHJhY2V5IEZhaXJ3ZWF0aGVyIHRyYWNleWZAZGFmZi5nb3YuemF8SW5jbHVkZWR8CnxaQUYtSU5EICB8SW5kaWFuIE9jZWFuIFpBfEluZGlhbiBPY2VhbiBTb3V0aCBBZnJpY2F8RGVwYXJ0bWVudCBvZiBGb3Jlc3RyeSwgRmlzaGVyaWVzIGFuZCB0aGUgRW52aXJvbm1lbnQsIFNvdXRoIEFmcmljYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fCBUcmFjZXkgRmFpcndlYXRoZXIgdHJhY2V5ZkBkYWZmLmdvdi56YXxJbmNsdWRlZHwKCgoKCmBgYHtyIHB1bGwgaW4gZmlzaGdsb2IgZGF0YWJhc2V9CgpGaXNoR2xvYl8xLjUgPC0gZnJlYWQoaGVyZTo6aGVyZSgiZGF0YSIsIkZJU0hHTE9CX3YxLjVfY2xlYW4uY3N2IikpCgpgYGAKClRoaXMgdmVyc2lvbiBvZiBGaXNoR2xvYiBsZWF2ZXMgb3V0IHNlYXNvbnMgZm9yIEdNRVgsIGZpeCBoZXJlCgpgYGB7ciBhZGQgc2Vhc29uIHRvIEdNRVh9CiNhZGQgc2Vhc29uIHRvIEdNRVggdG8gc3VydmV5IHVuaXQKCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIkdNRVgiLCBzdXJ2ZXlfdW5pdCA6PSBwYXN0ZTAoc3VydmV5LCItIixzZWFzb24pXQpgYGAKCkFsc28gYWRkaW5nIGluIHNlYXNvbnMgZm9yIE5JR0ZTCgpgYGB7ciBhZGQgc2Vhc29uIHRvIE5JR0ZTfQojYWRkIHNlYXNvbiB0byBHTUVYIHRvIHN1cnZleSB1bml0CgpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJOSUdGUyIsIHN1cnZleV91bml0IDo9IHBhc3RlMChzdXJ2ZXksIi0iLHF1YXJ0ZXIpXQpgYGAKClpBRiAoU291dGggQWZyaWNhKSBoYXMgZGlzdGluY3QgQXRsYW50aWMgYW5kIEluZGlhbiBzdXJ2ZXlzIChzcGxpdCAgYXQgfjIwLjAxy5ogRSwgQ2FwZSBBZ3VsaGFzKQoKYGBge3IgYWRkIGxvbmdpdHVkaW5hbCByZWdpb24gdG8gWkFGfQpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJaQUYiICYgbG9uZ2l0dWRlIDwyMC4wMSwgc3VydmV5X3VuaXQgOj0gIlpBRi1BVEwiXVtzdXJ2ZXkgPT0gIlpBRiIgJiBsb25naXR1ZGUgPj0gMjAuMDEsIHN1cnZleV91bml0IDo9ICJaQUYtSU5EIl0KYGBgCgpSZWdpb24gbmFtZXMKYGBge3J9CnNvcnQodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkKYGBgCiMjRGF0YSBSZXBsYWNlbWVudHMKIyMjI0dyZWVubGFuZCAodmVyc2lvbiBpbiBGaXNoR2xvYiAxLjUgaXMgbWlzc2luZyBsZW5ndGhzIGFuZCB0aGVyZWZvcmUgYmlvbWFzcyB2YWx1ZXMpClRoaXMgdmVyc2lvbiB3YXMgb2J0YWluZWQgZGlyZWN0bHkgZnJvbSBLYXJsLU1pY2hhZWwgV2VybmVyIFtrYXJsLW1pY2hhZWwud2VybmVyQHRodWVuZW4uZGVdKGthcmwtbWljaGFlbC53ZXJuZXJAdGh1ZW5lbi5kZSkgd2hvIG5vdyBtYW5hZ2VzIHRoZSBHcmVlbmxhbmQgc3VydmV5IFNlcHRlbWJlciAyMDIzLiBIZSBpcyBiYXNlZCBpbiBHZXJtYW55LgoKYGBge3J9CiNncmVlbmxhbmQgPC0gCgpgYGAKCiMjIyNOb3J3YXkKUHJlcHBlZCBieSBMYXVyZW5lIFBlY3VjaGV0IChVIFRyw7Ztc28sIE5vcndheSkgU2VwdGVtYmVyIDIwMjMgdG8gcmVwbGFjZSB3aGF0J3MgaW4gRmlzaEdsb2IgMS41IGJlY2F1c2UgSU1SICJhcmUgcXVpdGUgY29uY2VybmVkIHRoYXQgRmlzaEdsb2IsIGFuZCBvdGhlciBzdHVkaWVzLCBoYXZlIGJlZW4gdXNpbmcgYSAiZmxhd2VkIiBtdWx0aS1zdXJ2ZXlzIGRhdGFzZXQgdGhhdCBpcyBhdmFpbGFibGUgaW4gTk1EQyAoZGF0YSBwb3J0YWwgb2YgSU1SKS4gVHVybnMgb3V0IHRoYXQgdGhpcyBkYXRhc2V0IHdhcyBwdXQgcHVibGljbHkgYnkgbWlzY29tbXVuaWNhdGlvbiBvbiBOTURDIGFmdGVyIG9uZSBwdWJsaXNoZWQgcGFwZXIgaW4gU2NpZW50aWZpYyBSZXBvcnRzLCBhbmQgSSB0aGluayB0aGV5IG9ubHkgcmVhbGl6ZWQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGRhdGFzZXQganVzdCB0aGUgbGFzdCB5ZWFyIGFzIHNvbWUgcGFwZXJzIGFyZSBjb21pbmcgb3V0IHVzaW5nIGl0IChlc3BlY2lhbGx5IHRoZSBvbmUgZnJvbSBDZXNjIEdvcmRvLVZpbGFzZWNhIGluIFBOQVMgaHR0cHM6Ly93d3cucG5hcy5vcmcvZG9pLzEwLjEwNzMvcG5hcy4yMTIwODY5MTIwKS4gVGhleSBhcmUgbm93IHRyeWluZyB0byBtYWtlIHNvbWUgZGFtYWdlIGNvbnRyb2xzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgdXNlZCBldmVyIGFnYWluIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IGNsZWFuZGVkIGFuZCBzdGFuZGFyZGlzZWQgZGF0YXNldHMgb2YgdGhlIEJhcmVudHMgU2VhIHN1cnZleSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUgaW4gTk1EQyBhcmUgdXNlZCBpbnN0ZWFkIG9mLgoKU2VwdGVtYmVyIDE0OiBGcm9tIExhdXJlbmUsICJJIHNlbmQgeW91IGluIGF0dGFjaG1lbnQgdGhlIOKAnG5ld+KAnSBJTVIgc3VydmV5IGZvcm1hdHRlZCBmb3IgRmlzaGdsb2IuIEkgaGF2ZSBkb25lIHNvbWUgc21hbGwgY2hlY2sgb2YgdGhlIGRhdGFzZXQsIGFuZCBzbyBmYXIgZXZlcnl0aGluZyBsb29rcyBnb29kLCBidXQgSSBkaWRu4oCZdCBkbyBhIGRlZXAgY2hlY2sgeWV0LCBidXQgSSBkb27igJl0IHNlZSB3aHkgdGhlcmUgc2hvdWxkIGJlIGFueSBwcm9ibGVtcyB3aXRoIGl0Li4uLkZvciB5b3VyIHN0dWR5LCBJIHRoaW5rIGl0IGlzIGFsc28gaW1wb3J0YW50IHRoYXQgeW91IGtub3cgdGhhdCB0aGVyZSBoYXMgYmVlbiBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0YXhvbm9taWMgZGVzY3JpcHRpb25zIGluIHRoZSBCYXJlbnRzIFNlYSBzbyB0aGF0IHNvbWUgc3BlY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhdCB0aGUgZ2VudXMgbGV2ZWwgaW5zdGVhZCBvZiBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2lzLCBJIHNlbmQgeW91IGluIGF0dGFjaCBhbiBleGNlbCAoQmFyZW50cyBTZWEgRmlzaCBSZWZlcmVuY2UgTGlzdC5jc3YpIGZpbGUgdGhhdCBzdW1tYXJpemUgd2hpY2ggc3BlY2llcyBtaWdodCBiZSBhIG1pc2lkZW50aWZpY2F0aW9uIGFuZCB3aGljaCBvbmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW5kIG1lcmdlZC4iIEFsbCBvZiB0aGVzZSBmaWxlcyBub3cgbGl2ZSBpbiAiZGF0YS9Ob3J3YXlfU2VwMjAyMyIKCkhlbHBmdWwgZ3VpZGFuY2UgZnJvbSBoZXJlOiBodHRwczovL3d3dy5oaS5uby9lbi9oaS9uZXR0cmFwcG9ydGVyL3JhcHBvcnQtZnJhLWhhdmZvcnNrbmluZ2VuLWVuLTIwMjEtMTUKLSAiMi4yLjUgLSBSZWNvbW1lbmRlZCBhZGp1c3RtZW50cyB0byB0aGUgb3V0cHV0IGJlZm9yZSBhbmFseXNpcwpFZWxwb3V0cyBhbmQgbGlwYXJpZHMuIFdoZW4gY29tYmluZyB5ZWFycywgd2UgcmVjb21tZW5kIHRoYXQgYWxsIHJlY29yZHMgb2YgZWVscG91dHMgKFpvYXJjaWRhZSkgYXJlIHBvb2xlZCB0byB0aGUgZmFtaWx5IGxldmVsLCBiZWNhdXNlIHRoZXkgYXJlIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBpZGVudGlmeSAoc2VlIEFwcGVuZGl4IDMpLiBUaGUgc2FtZSBhcHBseSB0byBsaXBhcmlkcyAoTGlwYXJpZGFlKS4gSWYgc3BlY2llcyBsZXZlbCBkYXRhIG9mIHRoZXNlIGZhbWlsaWVzIGFyZSB1c2VkLCBjb25zaWRlciBleGNsdWRpbmcgZGF0YSBmcm9tIDIwMDQtMjAwNi8yMDA3LiBUaGVzZSB5ZWFycyB0aGUgc3RhZmYgb24gc29tZSBvZiB0aGUgTm9yd2VnaWFuIHZlc3NlbHMgd2VyZSBpbmV4cGVyaWVuY2VkLCBhbmQgcHJvcGVyIGlkZW50aWZpY2F0aW9uIGtleXMgZm9yIGFyY3RpYyBzcGVjaWVzIHdlcmUgbGFja2luZyAoY29tcGFyZSBmb3IgaW5zdGFuY2UgY2F0Y2hlcyBvZiBMeWNvZGVzIGZyaWdpZHVzIGFuZCBMeWNvZGVzIGV1ZGlwbGV1cm9zdGljdHVzIGluIHRoZSBmaXJzdCB5ZWFycyB0byB0aGUgbGF0ZXIgeWVhcnMsIEFwcGVuZGl4IDMpLiBJZiBzcGVjaWVzIGxldmVsIGRhdGEgb2YgdGhlc2UgZmFtaWxpZXMgYXJlIHVzZWQsIHJlY29yZHMgdG8gZmFtaWx5IGxldmVscyBzaG91bGQgYmUgcmVtb3ZlZCBvciBlbHNlIHRoZXNlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGZ1cnRoZXIgYW5hbHlzaXMgb2YgdGhlIGRhdGEuIEJvdGggWm9hcmNpZGFlIGFuZCBMaXBhcmlkYWUgaGF2ZSB1bnJlc29sdmVkIHRheG9ub215IGZvciBzb21lIGdlbmVyYSwgdGhlcmVmb3JlIHdlIGhhdmUgY2hvc2VuIHRvIHBvb2wgYWxsIGxpcGFyaWRzIG9mIHRoZSBnZW51cyBDYXJlcHJvY3R1cyBhbmQgYWxsIGVlbHBvdXRzIG9mIHRoZSBnZW51cyBHeW1uZWx1cyBpbiB0aGUgb3V0cHV0LiBTZWJhc3Rlcy4gVGhlIGNvbHVtbiAiIFNlYmFzdGVzIHNwcC4iIGNvbnRhaW5zIG1haW5seSBqdXZlbmlsZSByZWRmaXNoLiBTbWFsbCBzcGVjaW1lbnMgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGlkZW50aWZ5IHNvIHRoZSBwcm90b2NvbCBpcyB0byBpZGVudGlmeSBvbmx5IGluZGl2aWR1YWxzIGxhcmdlciB0aGFuIDEwIGNtIHRvIHRoZSBzcGVjaWVzIGxldmVsLiBCZWZvcmUgYW5hbHlzaXMsIGFsbCByZWRmaXNoICggUyAuIG1lbnRlbGxhICwgUy4gbm9ydmVnaWN1cywgUy4gdml2aXBhcnVzIGFuZCBTZWJhc3RlcyBzcHAgLikgc2hvdWxkIGJlIHBvb2xlZCwgb3IgU2ViYXN0ZXMgc3BwLiBzaG91bGQgYmUgcmVtb3ZlZCDigJMgaWYgbm90IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGFuYWx5c2lzIC4gUmVjb3JkcyBpbiBBcHBlbmRpeCAyLiBUaGUgcmVjb3JkcyBvZiB0aGUgUy4gdml2aXBhcnVzIHdlc3Qgb2YgU3ZhbGJhcmQoU3BpdHNiZXJnZW4pIGFyZSB1bnJlbGlhYmxlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBTZWJhc3RlcyBkYXRhIGFyZSBrZXB0IGF0IHRoZSBzcGVjaWVzIGxldmVsIChBcHBlbmRpeCAyKS4gU3BlY2llcyB2ZXJpZmllZCBmb3IgdGhlIEJhcmVudHMgU2VhLCBidXQgb3V0bGllcnMgaW4gdGVybXMgdGhlIG5vcm1hbCBkZXB0aCByYW5nZSwgZGlzdHJpYnV0aW9uIGFyZWEgd2l0aGluIHRoZSBCYXJlbnRzIFNlYSwgc2l6ZSBldGMuIHdlcmUgY29kZWQgYXMgcXVlc3Rpb25hYmxlIGluIHRoZSBkYXRhIGJhc2UgKEFwcGVuZGl4IDIpIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYW5hbHlzaXMuIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgcGVsYWdpYyBzcGVjaWVzIChlLmcuIGNhcGVsaW4gYW5kIGhlcnJpbmcpLCBhcyB0aGVzZSBhcmUgcG9vcmx5IHNhbXBsZWQgYnkgdGhlIGJvdHRvbSB0cmF3bC4gVGhlIGRhdGEgc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCB3aXRoIHRvd2luZyBkaXN0YW5jZSBiZWZvcmUgYW5hbHlzaXMuIgoKVGhlcmVmb3JlLCB3ZSB3aWxsOgotIFJlbW92ZSBhbGwgcmVjb3JkcyBvZiBlZWxwb3V0cyBhbmQgbGlwYXJpZHMgKEZhbWlseSA9IFpvYXJjaWRhZSBvciBMaXBhcmlkYWUpIChhcyB3ZSBvbmx5IGluY2x1ZGUgc3BlY2llcyBJRCdkIHRvIHNwZWNpZXMpCi0gUmVtb3ZlIHJlZGZpc2ggKEdlbnVzID0gU2ViYXN0ZXMpCgpgYGB7ciBub3J3YXkgZGF0YX0KCiNsb2FkIE5vcndlZ2lhbiBkYXRhCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsIk5vcndheV9TZXAyMDIzIiwiTk9SLUJUU19jbGVhbi5SRGF0YSIpKQpub3J3YXlfY2xlYW4gPC0gZGF0YS50YWJsZShkYXRhKQoKI3JlbW92ZSBvYnNlcnZhdGlvbnMgd2l0aG91dCBkYXRlcwpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuW2NvbXBsZXRlLmNhc2VzKG5vcndheV9jbGVhblssLihtb250aCldKSxdCgojcmVtb3ZlIHNwZWNpZXMgcmVjb3JkcyBpbiBhY2NvcmRhbmNlIHdpdGggcmVjb21tZW5kYXRpb24gZnJvbSBISQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWyEoZmFtaWx5ICVpbiUgYygiWm9hcmNpZGFlIiwiTGlwYXJpZGFlIikgfCBnZW51cyA9PSAiU2ViYXN0ZXMiKSxdCgojc29tZSBjb2x1bW4gbmFtZXMgZG9uJ3QgbWF0Y2ggZmlzaGdsb2IgKGZpc2hnbG9iID0gbnVtLCBudW1faCwgbnVtX2NwdWUsIHdndCwgd2d0X2gsIHdndF9jcHVlOyBub3J3YXkgPSBudW0sIG51bV9jcHVlIChudW1iZXIgb2YgaW5kLi9ob3VyKSwgbnVtX2NwdWEgKG51bWJlciBvZiBpbmQuL2ttMiksIHdndCwgd2d0X2NwdWUgKGtnL21pbiksIHdndF9jcHVhKGtnL2ttMikgICkKI2Fsc28sIHNvbWUgY29sdW1uIHVuaXRzIGluIHRoZSByZWFkbWUgYXJlIGluIGNvcnJlY3QuIFRoZXJlZm9yZSwgSSB3aWxsIGdlbmVyYXRlIF9jcHVlIGFuZCBfaCB2YWx1ZXMgaGVyZQojIHdlIHdpbGwgbmVlZCB0byBjaGVjayAgYW5kIHJlbmFtZSBjb2x1bW5zCnNldG5hbWVzKG5vcndheV9jbGVhbiwgYygiaGF1bF9kdXIiKSwgYygiaGF1bF9kdXJfbSIpKQpub3J3YXlfY2xlYW5bLGhhdWxfZHVyIDo9IGhhdWxfZHVyX20vNjBdICNoYXVsIGR1cmF0aW9uIGN1cnJlbnRseSBpbiBtaW51dGVzLCBuZWVkIGhvdXJzCm5vcndheV9jbGVhblssbnVtX2ggOj0gbnVtL2hhdWxfZHVyXVssbnVtX2NwdWUgOj0gbnVtL2FyZWFfc3dlcHRdWyx3Z3RfaCA6PSB3Z3QvaGF1bF9kdXJdWyx3Z3RfY3B1ZSA6PSB3Z3QvYXJlYV9zd2VwdF0KCiNjaGFuZ2Ugc29tZSBjb2x1bW5zIHRvIG51bWVyaWMKY29scyA9IGMoIm1vbnRoIiwiZGF5IikKbm9yd2F5X2NsZWFuWywoY29scykgOj0gbGFwcGx5KC5TRCxhcy5udW1lcmljKSwuU0Rjb2xzID0gY29sc10KCiNhbHNvLCBkZWxldGUgc291cmNlIGFuZCB0aW1lc3RhbXAKZmlzaGdsb2JfY29sbmFtZXMgPC0gY29sbmFtZXMoRmlzaEdsb2JfMS41KQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWywuLmZpc2hnbG9iX2NvbG5hbWVzXQoKbm9yd2F5X2NsZWFuW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoMTo2KSwgc3VydmV5X3VuaXQgOj0gIk5vci1CVFMtMSJdW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoNzoxMiksIHN1cnZleV91bml0IDo9ICJOb3ItQlRTLTMiXQoKI092ZXJsYXAgYmV0d2VlbiBJQlRTIGFuZCBOb3ItQlRTIHN1cnZleXMgYmVsb3cgNjLLmmxhdGl0dWRlLCBzbyBkZWxldGUgYWxsIGhhdWxzIHRoYXQgb2NjdXIgYmVsb3cgNjLLmmxhdGl0dWRlCm5vcndheV9jbGVhbiA8LSBub3J3YXlfY2xlYW5bbGF0aXR1ZGUgID49IDYyLF0KCmBgYAoKCkRlbGV0ZSBHcmVlbmxhbmQgYW5kIE5vcndheQpgYGB7cn0KRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKHN1cnZleSAlaW4lIGMoIk5vci1CVFMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiR1JMLURFIiAjaWdub3JlIGdyZWVubGFuZCBmb3Igbm93Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQpgYGAKCgpBZGQgaW4gdXBkYXRlZCBHcmVlbmxhbmQgYW5kIE5vcndheSBkYXRhCmBgYHtyfQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsbm9yd2F5X2NsZWFuKQojRmlzaEdsb2JfMS41IDwtcmJpbmQoRmlzaEdsb2JfMS41LGdyZWVubGFuZCkKYGBgCgoKIyNQcmVsaW1pbmFyeSBEYXRhIEN1dHMKIyMjU3BlY2lmaWMgUmVnaW9uYWwgQ2hhbmdlcyBCZWZvcmUgQ3V0dGluZyB0byAxMCB5ZWFycyBvbmx5CgoqR1NMKgotIE5vcnRoOiB3ZSBoYXZlIGRhdGEgMTk4MC0yMDE5LCBidXQgZ2VhciBjaGFuZ2VzIGluIDIwMDQvMjAwNSwgc28gbGV0J3MgdXNlIGxhdGVyIHBvcnRpb24gKG1vcmUgY29uc2lzdGVudCBtb250aHMgb2Ygc2FtcGxpbmc7IDIwMDUtMjAxOTsgMTUgeWVhcnMpIAotIFNvdXRoOiB3ZSBoYXZlIGRhdGEgMTk3MC0yMDE5LCBidXQgZ2Vhci92ZXNzZWwgY2hhbmdlcyBpbiAxOTg1IGFuZCBhZ2FpbiBpbiAxOTkyLCBzbyBhZ2FpbiBsZXQncyB1c2UgbGF0ZXIgcG9ydGlvbiAoMTk5Mi0yMDE5OyAyNyB5ZWFycykKLSBTZWUgW3RoaXMgZ2l0aHViIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vQXF1YUF1bWEvZmlzaGdsb2IvaXNzdWVzLzcyKQoKYGBge3IgR1NMIGZpeGVzfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9HU0wgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJHU0wtTiIgJiB5ZWFyIDwgMjAwNSl8KHN1cnZleSA9PSAiR1NMLVMiICYgeWVhciA8IDE5OTIpLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfR1NMKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqU0dFT1JHKgotIEZyb20gTWFydGluIENvbGxpbnMsICJNb3N0IHN1cnZleXMgd2VyZSBmb2N1c2VkIG9uIGRlbWVyc2FsIGZpc2ggb24gdGhlIFNvdXRoIEdlb3JnaWEgc2hlbGYgKDwgMzUwIG0pLCBidXQgc3VydmV5cyBpbiAyMDAzLCAyMDEwIGFuZCAyMDE5IGhhZCBzb21lIGRlZXBlciB0cmF3bHMuICBUaGUgZGVlcGVyIHRyYXdscyBjYXVnaHQgdmVyeSBkaWZmZXJlbnQgZmlzaCwgc28gYXJlIHVubGlrZWx5IHRvIGJlIG9mIHVzZSB0byBhIGxvbmctdGVybSBhbmFseXNpcywgYnV0IEkgaGF2ZSBsZWZ0IHRoZW0gaW4uIgoKLURlbGV0ZSBhbGwgdHJhd2xzIGRlZXBlciB0aGFuIDM1MCBNCmBgYHtyfQpoYXVsX2lkc190b19yZW1vdmVfU0dFT1JHIDwtIHVuaXF1ZShGaXNoR2xvYl8xLjVbKHN1cnZleSA9PSAiU0dFT1JHIiAmIGRlcHRoID4zNTApLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfU0dFT1JHKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqTlotQ0hBVCoKLWJ1bXAgZGVjZW1iZXIgb2JzZXJ2YXRpb25zIHRvIG5leHQgeWVhciBiZWNhdXNlIG9ic2VydmF0aW9ucyBvY2N1ciBpbiAxMiwxLDIKYGBge3J9CiNidW1wIG9ic2VydmF0aW9ucyBmb3J3YXJkCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIk5aLUNIQVQiICYgbW9udGggPT0gMTIsICB5ZWFyIDo9IHllYXIrMSwgXQpgYGAKCgojIyNCZWNhdXNlIHRpbWUgaXMgYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGVzZSBhbmFseXNlcywgd2Ugd2lsbCBnZXQgcmlkIG9mIGFueSBzdXJ2ZXkgeCBzZWFzb24gY29tYmluYXRpb25zIHRoYXQgYXJlIG5vdCBzYW1wbGVkIGZvciBhdCBsZWFzdCAxMCB5ZWFycwoKYGBge3Igc3VtbWFyeSBieSBzdXJ2ZXkgcmVnaW9ufQojbmV3IHJvdyBmb3IgdG90YWwgbnVtYmVyIG9mIHllYXJzIHNhbXBsZWQKRmlzaEdsb2JfMS41Wyx5ZWFyc19zYW1wbGVkIDo9IGxlbmd0aCh1bmlxdWUoeWVhcikpLC4oc3VydmV5X3VuaXQpXQoKc3VtbWFyeShGaXNoR2xvYl8xLjUkeWVhcnNfc2FtcGxlZCkgI3JhbmdlcyBmcm9tIDIgKERGTyBTdHJhaWdodCBvZiBHZW9yZ2lhKSB0byA1NyAoTm9ydGhlYXN0IFVTKQpWaWV3KHVuaXF1ZShGaXNoR2xvYl8xLjVbLC4oc3VydmV5X3VuaXQsIHllYXJzX3NhbXBsZWQpXSkpCgojc3RhdGlzdGljcyBhYm91dCBmdWxsIGRhdGFzZXQKbnJvdyhGaXNoR2xvYl8xLjUpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5XSkpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkgCgojcmVtb3ZlIG9ic2VydmF0aW9ucyBmb3IgYW55IHJlZ2lvbnMgeCBzZWFzb24gY29tYmluYXRpb25zIHNhbXBsZWQgbGVzcyB0aGFuIDEwIHRpbWVzCkZpc2hHbG9iLjEweWVhciA8LSBGaXNoR2xvYl8xLjVbeWVhcnNfc2FtcGxlZCA+PSAxMCxdCgojc3RhdGlzdGljcyBhYm91dCByZWR1Y2VkIDEwIHllYXIgZGF0YXNldApucm93KEZpc2hHbG9iLjEweWVhcikgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxzdXJ2ZXldKSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxhcy5jaGFyYWN0ZXIoc3VydmV5X3VuaXQpXSkpIAoKI3JlbW92ZSBmdWxsIGRhdGFiYXNlCnJtKEZpc2hHbG9iXzEuNSkKCgpgYGAKCiMjI0ZvciB0YXhvbm9taWMgYW5hbHlzZXMsIHJlc29sdXRpb24gdG8gc3BlY2llcyBpcyByZXF1aXJlZC4gVGhlcmVmb3JlLCB3ZSB3aWxsICBleGNsdWRlIGFueSBvYnNlcnZhdGlvbnMgbm90IHJlc29sdmVkIHRvIHNwZWNpZXMuIAoKYGBge3Igc3BwIElEIG9ubHl9CiNtb250aCBhIG51bWJlcgpGaXNoR2xvYi4xMHllYXJbLG1vbnRoIDo9IGFzLm51bWVyaWMobW9udGgpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcCA8LSBGaXNoR2xvYi4xMHllYXJbcmFuayAlaW4lIGMoIlNwZWNpZXMiLCAiU3Vic3BlY2llcyIpLF0gIzM4NjkzODQgdG90YWwgb2JzZXJ2YXRpb25zCgojcmVtb3ZlIGZ1bGwgc3BlY2llcyBkYXRhYmFzZQpybShGaXNoR2xvYi4xMHllYXIpCgojdmVjdG9yIHdpdGggYWxsIHN1cnZleSBuYW1lcwphbGxfc3VydmV5X3VuaXRzIDwtIHNvcnQodW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLHN1cnZleV91bml0XSkpCgojY2FsY3VsYXRlICMgc3BlY2llcyBwZXIgeWVhcgpGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWywuKHN1cnZleV91bml0LCB5ZWFyLCBhY2NlcHRlZF9uYW1lKV0pCgpGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyWyxzcHBfY291bnRfc3VydmV5X3llYXIgOj0gdW5pcXVlTihhY2NlcHRlZF9uYW1lKSwuKHN1cnZleV91bml0LCB5ZWFyKV0KCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIuciA8LXVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyWywuKHN1cnZleV91bml0LCAgeWVhciwgc3BwX2NvdW50X3N1cnZleV95ZWFyKV0pCgpucm93KEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucikKCiNjYWxjdWxhdGUgIyBoYXVscyBwZXIgeWVhcgpGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWywuKHN1cnZleV91bml0LCB5ZWFyLCBoYXVsX2lkKV0pCgpGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyWyxoYXVsaWRfY291bnRfc3VydmV5X3llYXIgOj0gdW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleV91bml0LCB5ZWFyKV0KCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIuciA8LXVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyWywuKHN1cnZleV91bml0LCAgeWVhciwgaGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKV0pCgpucm93KEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucikKCmBgYAoKCiMjVmlzdWFsbHkgSW5zcGVjdCBEaXN0cmlidXRpb24gb2YgRGF0YSBUaHJvdWdoIFRpbWUgYW5kIFNwYWNlCgojI1NwYXRpYWwgYW5kIFRlbXBvcmFsIFBhdHRlcm5zIGluIEFsbCBUcmF3bCBTdXJ2ZXlzCgpMZXQncyBsb29rIGF0IHRoZSBudW1iZXIgb2YgaGF1bHMgcGVyIHllYXIvbW9udGggYW5kIHllYXIvcXVhcnRlciBhbmQgeWVhci9zZWFzb24gdmlzdWFsbHkKCmBgYHtyIGhhdWxzIHBlciB5ZWFyLCBtb250aCwgcXVhcnRlcn0KI3VuaXF1ZSBzdXJ2ZXksIHN1cnZleV91bml0LCB5ZWFyLCBtb250aCwgcXVhcnRlciwgc2Vhc29uLCBoYXVsX2lkLCBsYXQsIGxvbgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5LCBzdXJ2ZXlfdW5pdCwgeWVhcixtb250aCxxdWFydGVyLHNlYXNvbixoYXVsX2lkLCBsYXRpdHVkZSwgbG9uZ2l0dWRlLGhhdWxfZHVyKV0pCgojYWRkIGNvbHVtbiB3aXRoIGFkanVzdGVkIGxvbmdpdHVkZSBmb3IgZmV3IHN1cnZleXMgdGhhdCBjcm9zcyBkYXRlbGluZSAoTlotQ0hBVCBhbmQgQUkpCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssbG9uZ2l0dWRlX2FkaiA6PSBpZmVsc2UoKHN1cnZleV91bml0ICVpbiUgYygiQUkiLCJOWi1DSEFUIikgJiBsb25naXR1ZGUgPiAwKSxsb25naXR1ZGUtMzYwLGxvbmdpdHVkZSldCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSwgbW9udGgsIHNlYXNvbildWywgI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSwgc2Vhc29uLCBhbmQgbW9udGgKICAgICAgICAgICAgICAgICAgICAgaGF1bF9jb3VudHNfcGVyX3N1cnZleV9xdWFydGVyX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSwgbW9udGgsIHF1YXJ0ZXIpXVssI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSwgbW9udGgsIGFuZCBxdWFydGVyCiAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2hhdWxzX3N1cnZleSA6PXVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXkpXVssI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSBpbiBhbGwgeWVhcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXksIHNlYXNvbiwgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBvdmVyIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiA6PWhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoL3RvdGFsX2hhdWxzX3N1cnZleV1bLAogICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSwgcXVhcnRlciwgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBvdmVyIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIgOj1oYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGgvdG90YWxfaGF1bHNfc3VydmV5XVssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aCA6PXVuaXF1ZU4oaGF1bF9pZCksLih5ZWFyLCBzdXJ2ZXlfdW5pdCwgbW9udGgpXVssICNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCwgeWVhciwgYW5kIG1vbnRoCiAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2hhdWxzX3N1cnZleV95ZWFyIDo9IHVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXlfdW5pdCx5ZWFyKV1bLCAjY291bnQgdG90YWwgIyBoYXVscyBwZXIgc3VydmV5IHVuaXQgYW5kIHllYXIKICAgICAgICAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5IHVuaXQgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBoYXVscyB3aXRoaW4gYSBzdXJ2ZXkgdW5pdCB3aXRoaW4gYSB5ZWFyCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkgOj0gaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfbW9udGgvdG90YWxfaGF1bHNfc3VydmV5X3llYXJdWywgCgogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9xdWFydGVyIDo9dW5pcXVlTihoYXVsX2lkKSwuKHllYXIsIHN1cnZleV91bml0LCBxdWFydGVyKV1bLCAjY291bnQgIyBoYXVscyBwZXIgc3VydmV5IHVuaXQsIHllYXIsIGFuZCBtb250aAogICAgICAgICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXkgdW5pdCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIGhhdWxzIHdpdGhpbiBhIHN1cnZleSB1bml0IHdpdGhpbiBhIHllYXIKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5IDo9IGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIvdG90YWxfaGF1bHNfc3VydmV5X3llYXJdIAoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbiA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgc3VydmV5X3VuaXQsIG1vbnRoLCBzZWFzb24sIGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfc2Vhc29uX21vbnRoLHRvdGFsX2hhdWxzX3N1cnZleSwgaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IHNlYXNvbiBhY3Jvc3MgYWxsIHllYXJzCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSxzdXJ2ZXlfdW5pdCAsIG1vbnRoLCBxdWFydGVyLCBoYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGgsdG90YWxfaGF1bHNfc3VydmV5LCBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IHF1YXJ0ZXIgYWNyb3NzIGFsbCB5ZWFycwoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgeWVhciwgc3VydmV5X3VuaXQsIG1vbnRoLCBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aCx0b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcixoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBtb250aCB3aXRoaW4geWVhcnMKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWywuKHN1cnZleSwgeWVhciwgc3VydmV5X3VuaXQsIHF1YXJ0ZXIsIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIsdG90YWxfaGF1bHNfc3VydmV5X3llYXIsaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBtb250aCB3aXRoaW4geWVhcnMKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHNlYXNvbiBhbmQgbW9udGg/CnN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb24pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXksc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZShzdXJ2ZXlfc2Vhc29uX21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJzdXJ2ZXlfc2Vhc29uX21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gNSwgd2lkdGggPSAxNSwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggcXVhcnRlciBhbmQgbW9udGg/CnN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcikgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIGZhY2V0X3dyYXAofnN1cnZleSxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJzdXJ2ZXlfcXVhcnRlcl9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDUsIHdpZHRoID0gMTUsIHVuaXRzID0gImluIikKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHllYXIgYW5kIG1vbnRoPwp5ZWFyX3N1cnZleV9tb250aF9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aCkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHllYXJfc3VydmV5X21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKZ2dzYXZlKHllYXJfc3VydmV5X21vbnRoX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHllYXIgYW5kIG1vbnRoPwp5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXIpICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5X3VuaXQsc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSh5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpnZ3NhdmUoeWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscywgZmlsZW5hbWUgPSAieWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKYGBgCgpOb3csIGxldCdzIGxvb2sgYXQgaG93IGxvY2F0aW9uIG9mIHNhbXBsaW5nIHZhcmllcyBieSBtb250aCBvZiBzYW1wbGluZyBhbmQgeWVhciBvZiBzYW1wbGluZyAKCmBgYHtyIGxvY2F0aW9uIGJ5IHllYXIgcGxvdHN9CmxvY2F0aW9uX2J5X3llYXIgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscykgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUobG9jYXRpb25fYnlfeWVhciwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfeWVhci5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV95ZWFyLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV95ZWFyLmpwZyIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X3llYXIsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X3llYXIuZXBzIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCmBgYAoKCmBgYHtyIGxvY2F0aW9uIGJ5IG1vbnRoIHBsb3RzfQoobG9jYXRpb25fYnlfbW9udGggPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscykgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gYXMubnVtZXJpYyhtb250aCkpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X21vbnRoLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV9tb250aC5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV9tb250aCwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfbW9udGguanBnIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUobG9jYXRpb25fYnlfbW9udGgsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X21vbnRoLmVwcyIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQpgYGAKCgojI1JlZ2lvbiBTcGVjaWZpYyBEYXRhIFByb2Nlc3NpbmcKCi1GcmVkc3RvbiBldCBhbC4gMjAyMiBOYXR1cmUgYW5kIEJhdHQgZXQgYWwuIDIwMTcgRWNvbG9neSBMZXR0ZXJzIGluZm9ybWVkIE5vcnRoIEFtZXJpY2FuIGRhdGEgcHJvY2Vzc2luZwotUGVyc29uYWwgY29tbXVuaWNhdGlvbiB3aXRoIEF1cm9yZSBNYXVyZWF1ZCBhbmQgTGF1cmVuZSBQZWN1Y2hldCByZTogd29yayBieSBBLiBNYXVyZWF1ZCwgTC4gUGVjdWNoZXQgYW5kIFIuIEZyZWxhdCBhbmQgdGhlIHN1cHBsZW1lbnRhcnkgbWF0ZXJpYWwgZm9yIE1hdXJlYXVkIGV0IGFsLiAyMDE5IFByb2NlZWRpbmdzIG9mIHRoZSBSb3lhbCBTb2NpZXR5IEI6IEJpb2xvZ2ljYWwgU2NpZW5jZXMgaW5mb3JtZWQgRXVyb3BlYW4gZGF0YSBwcm9jZXNzaW5nCi1BZGRpdGlvbmFsIGRhdGEgcHJvY2Vzc2luZyBpbmZvcm1lZCBieSBkYXRhIGl0c2VsZiwgYW5kIGJ5IEZpc2hHbG9iIHBkZiBzdW1tYXJ5IGRvY3VtZW50cwotbGltaXQgdG8gbWF4IDMgbW9udGhzIGZvciBlYWNoIHN1cnZleSB1bml0LCByZXByZXNlbnRhdGl2ZSBvZiBhICdzZWFzb24nIChleGNlcHRpb24gPSBXZXN0IENvYXN0IFVTQSB3aGVyZSBhbGwgNCBtb250aHMgc2FtcGxlZCBjb25zaXN0ZW50bHkpCgojIyMjIkFJIgpgYGB7ciBBSSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQUkiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkFJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLSBNb3N0IGhhdWxzIGluIDYsNyw4Ci0gU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi0gTm8gZHJhbWF0aWMgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgCmBgYHtyIEFJIHByb2Nlc3Npbmd9CmFpX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQUkiICYgbW9udGggJWluJSBjKDY6OCksaGF1bF9pZF0pCmBgYAoKCiMjIyNCSVRTCihXZSBoYXZlIHR3byBzdXJ2ZXlzIGZvciBCSVRTLCBxdWFydGVyIDEgYW5kIHF1YXJ0ZXIgNCkKQklUUyAxCgpGcm9tIEZyZWRzdG9uIGV0IGFsLiAyMDIzLCBldmVyeSB5ZWFyIGFmdGVyIDIwMDAgaGFzID40MDAgaGF1bHMgYW5kIG1vc3Qgb2YgdGhlIGVhcmxpZXIgeWVhcnMgYXJlIDw1MCAKCmBgYHtyICBCSVRTMSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotS2VlcCBib3RoIG1vbnRocyAoMiwzKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1Db25zaXN0ZW50ICMgb2Ygc3BlY2llcyBhbmQgIyBoYXVscyBhZnRlciAyMDAwCmBgYHtyIEJJVFMxIHByb2Nlc3Npbmd9CmJpdHMxX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIiAmIG1vbnRoICVpbiUgYygyLDMpICYgeWVhciA+IDIwMDAsaGF1bF9pZF0pCmBgYAoKQklUUzQKYGBge3IgIEJJVFM0IHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotS2VlcCAoMTAsMTEsMTIpCi1TdGFydCBpbiAyMDAwIChzdGFydHMgaW4gMTk5NiwgYnV0IGdhcCBpbiAxOTk3IGFuZCAxOTk4LCBhbmQgMTk5NiBhbGwgaW4gRGVjZW1iZXI7IGFsc28gc3BwIHJpY2huZXNzIGluIGZpcnN0IHN1cnZleSB2ZXJ5IGxvdzsgY29uc2lzdGVudCAjIG9mIGhhdWxzIGFmdGVyIDIwMDApCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKCmBgYHtyIEJJVFM0IHByb2Nlc3Npbmd9CmJpdHM0X2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyID4gMjAwMCxoYXVsX2lkXSkKYGBgCgoKIyMjI0NITCAoQ2hpbGUpCgpgYGB7ciAgQ0hMIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJDSEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCi1LZWVwICg3LDgsOSkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBDSEwgcHJvY2Vzc2luZ30KY2hsX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQ0hMIiAmIG1vbnRoICVpbiUgYyg3OjkpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0RGTy1ORgoKCmBgYHtyICBERk8tTkYgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIGhhdWxpZCB0aHJvdWdoIHRpbWUKCmBgYHtyIERGTy1ORiBwcm9jZXNzaW5nfQpkZm9fbmZfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tTkYiICYgbW9udGggJWluJSBjKDEwOjEyKSxoYXVsX2lkXSkKYGBgCgoKIyMjI0RGTy1RQ1MKCmBgYHtyICBERk8tUUNTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLUtlZXAgKDcsOCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiByaWNobmVzcyBvdmVyIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gI2hhdWxzCgpgYGB7ciBERk8tUUNTIHByb2Nlc3Npbmd9CmRmb19xY3NfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tUUNTIiAmIG1vbnRoICVpbiUgYyg3LDgpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0VCUwoKLVNhbXBsaW5nIHllYXJzIHByaW9yIHRvIDE5ODQgKGRhdGEgYmVnaW4gaW4gMTk4Mikgd2VyZSBleGNsdWRlZCBmcm9tIGFuYWx5c2lzIGR1ZSB0byBsYXJnZSBhcHBhcmVudCBpbmNyZWFzZXMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIHJlY29yZGVkIGluIHRoZSBmaXJzdCB0d28geWVhcnMuIChCYXR0IGV0IGFsLiAyMDE3KQoKYGBge3IgIEVCUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJFQlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKLUtlZXAgKDYsNyw4KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1QZXIgQmF0dCBldCBhbC4gMjAxNywgbGltaXQgdG8gPj0gMTk4NAotTm8gY2xlYXIgY2hhbmdlcyAgaW4gcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBjbGVhciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBFQlMgcHJvY2Vzc2luZ30KZWJzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIiAmIG1vbnRoICVpbiUgYyg2LDcsOCkgJiB5ZWFyID49IDE5ODQsaGF1bF9pZF0pCmBgYAoKCiMjIyNFVkhPRQoKYGBge3IgIEVWSE9FIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotVmVyeSBsb3cgc2FtcGxpbmcgaW4gMjAxNyAoYW5kIGFsc28gbG93IHJpY2huZXNzKSwgZXhjbHVkZSB0aGlzIHllYXIKCmBgYHtyIEVWSE9FIHByb2Nlc3Npbmd9CmV2aG9lX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiICYgbW9udGggJWluJSBjKDEwLDExLDEyKSAmIHllYXIgIT0gMjAxNyAsaGF1bF9pZF0pCmBgYAoKCiMjIyNGQUxLIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIEZBTEsgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgRmVicnVhcnkgKDIpIG9ubHkgZnJvbSAyMDA0IG9ud2FyZCAobW9zdCBjb25zaXN0ZW50IHNhbXBsaW5nKQotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBuZXh0IHN0ZXAgd2l0aCBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbgoKCmBgYHtyIEZBTEsgcHJvY2Vzc2luZ30KZmFsa19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZBTEsiICYgbW9udGggJWluJSBjKDIpICYgeWVhciA+PSAyMDA0LCBoYXVsX2lkXSkKYGBgCgoKIyMjI0ZSLUNHRlMKCmBgYHtyICBGUi1DR0ZTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCgoKYGBge3IgRlItQ0dGUyBwcm9jZXNzaW5nfQpmcl9jZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNHSU4gKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKCmBgYHtyICBHSU4gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotRXhjbHVkZSB0aGlzIHJlZ2lvbiwgbm8gY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdJTiBwcm9jZXNzaW5nfQpnaW5faGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI0dNRVgKLUluIHRoZSBHdWxmIG9mIE1leGljbywgd2UgcmVzdHJpY3RlZCBvdXIgYW5hbHlzaXMgdG8gZGF0YSBmcm9tIDE5ODQgLSAyMDAwIChmdWxsIHJhbmdlICAxOTgyLTIwMTQpOyBpZiBhbGwgeWVhcnMgaGFkIGJlZW4gdXNlZCwgdGhlIG51bWJlciBvZiBzaXRlcyBzYW1wbGVkIGluIGF0IGxlYXN0IDg1JSBvZiB5ZWFycyAgd291bGQgZHJvcCBmcm9tIDM5IHRvIDEzLiAoQmF0dCBldCBhbC4gMjAxNykKCkdNRVggRmFsbCAKYGBge3IgIEdNRVggRmFsbCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDksMTAsMTEKLUluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIHdpbGwgcmVzdHJpY3QgdG8gPC04Ny41IGxvbmdpdHVkZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQoKCmBgYHtyIEdNRVgtRmFsbCBwcm9jZXNzaW5nfQpnbWV4X2ZhbGxfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgbG9uZ2l0dWRlX2FkaiA8IC04Ny41LCBoYXVsX2lkXSkKYGBgCgpHTUVYIFN1bW1lcgpgYGB7ciAgR01FWCBTdW1tZXIgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDUsNiw3Ci1JbiBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBzdGVwCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBiZWZvcmUgMjAwOCBhbmQgMjAwOCBvbndhcmQgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQotSnVtcCBmcm9tIDIwMDcgdG8gMjAwOCwgd2hlbiBzcGF0aWFsIGZvb3RwcmludCBpbmNyZWFzZXMsIHNvIEkgd2lsbCBvbmx5IHVzZSBkYXRhIGZyb20gYmVmb3JlIDIwMDgKCmBgYHtyIEdNRVgtU3VtbWVyIHByb2Nlc3Npbmd9CmdtZXhfc3VtbWVyX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiICYgbW9udGggJWluJSBjKDUsNiw3KSAmIHllYXIgPDIwMDgsIGhhdWxfaWRdKQpgYGAKCiMjIyNHT0EKYGBge3IgR09BIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHT0EiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50ICNoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdPQSBwcm9jZXNzaW5nfQpnb2FfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiICYgbW9udGggJWluJSBjKDYsNyw4KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0dSTC1ERQotRnJvbSBCZXVraG9mIGV0IGFsLiAyMDE5LCBhbGwgc3VydmV5cyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlcgpgYGB7ciBHUkwtREUgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotTm8gbW9udGhzIGluIGRhdGEgc2V0LCBidXQgYWNjb3JkaW5nIHRvIEJldWtob2YgZXQgYWwuIDIwMTksIGFsbCBzYW1wbGluZyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlciBzbyBrZWVwIGFsbCAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotIyBvZiBoYXVscyBkcm9wcyBiZXR3ZWVuIDE5OTEgYW5kIDE5OTIsIGFuZCBib3RoIDE5OTIgYW5kIDIwMTcgc28gbGltaXQgdG8geWVhcnMgYmV0d2VlbiAoMTk5My0yMDE2KQoKYGBge3IgR1JMLURFIHByb2Nlc3Npbmd9CmdybF9kZV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIgJiB5ZWFyICVpbiUgYygxOTkzOjIwMTYpLCBoYXVsX2lkXSkKYGBgCgojIyMjR1NMCgpHU0wtTgpgYGB7ciBHU0wtTiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA2LDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi0jIG9mIGhhdWxzIGluIDIwMDUgaXMgaGlnaGVyLCBzbyBzdGFydCBpbiAyMDA2CgpgYGB7ciBHU0wtTiBwcm9jZXNzaW5nfQpnc2xfbl9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIiAmIHllYXIgPiAyMDA1LCBoYXVsX2lkXSkKYGBgCgpHU0wtUwpgYGB7ciBHU0wtUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA4LDksMTAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBHU0wtUyBwcm9jZXNzaW5nfQpnc2xfc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIiAmIG1vbnRoICVpbiUgYyg4OjEwKSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lDRS1HRlMKCmBgYHtyIElDRS1HRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgSUNFLUdGUyBwcm9jZXNzaW5nfQppY2VfZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIgJiBtb250aCAlaW4lIGMoMjo0KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lFLUlHRlMKCmBgYHtyIElFLUlHRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDEwLDExLDEyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSBhZnRlciAyMDA0IChzYW1wbGVkIGZhciBlYXN0IGluIDIwMDMgYW5kIDIwMDQpCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBJRS1JR0ZTIHByb2Nlc3Npbmd9CmllX2lnZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyICA+IDIwMDQsIGhhdWxfaWRdKQpgYGAKCiMjIyNJUy1NT0FHIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIElTLU1PQUcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyB0b28gc2NhdHRlcmVkIG92ZXIgdGltZSwgZXhjbHVkaW5nCgpgYGB7ciBJUy1NT0FHIHByb2Nlc3Npbmd9CmlzX21vYWdfaGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI01FRElUUwpgYGB7ciBNRURJVFMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAgYWxsIHN1cnZleXMgaW4gcXVhcnRlciAyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTUVESVRTIHByb2Nlc3Npbmd9Cm1lZGl0c19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsIGhhdWxfaWRdKQpgYGAKCgojIyMjTVJUIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIE1SVCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJNUlQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyBpbmNvbnNpc3RlbnQsIGV4Y2x1ZGUgY29tcGxldGVseQoKYGBge3IgTVJUIHByb2Nlc3Npbmd9Cm1ydF9oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjTkFNCgpgYGB7ciBOQU0gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBzdXJ2ZXlzIGluIDEgYW5kIDIgKG1vc3QgY29uc2lzdGVudGx5IHNhbXBsZWQpCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgZXhjZXB0IGZvciAxOTk4IChleGNsdWRlKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGV4Y2VwdCBmb3IgMTk5OCAoZXhjbHVkZSkKCmBgYHtyIE5BTSBwcm9jZXNzaW5nfQpuYW1faGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOQU0iICYgbW9udGggJWluJSBjKDEsMikgJiB5ZWFyICE9IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTkVVUwoKCk5FVVMgU3ByaW5nCmBgYHtyIE5FVVMtU3ByaW5nIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDMsNCw1IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg3LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4MSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLVNwcmluZyBwcm9jZXNzaW5nfQojY2FsY3VsYXRlIHdndF9jcHVlIChrbV4yIGF2ZyBmcm9tIHNlYW4gTHVjZXkpIGFuZCB3Z3RfaCAoYWxsIGJpb21hc3MgdmFsdWVzIGNhbGlicmF0ZWQgdG8gc3RhbmRhcmQgcHJlIDIwMDkgMzAgbWludXRlIHRvdykKRmlzaEdsb2IuMTB5ZWFyLnNwcFtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfaCA6PSB3Z3QvMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfY3B1ZSA6PSB3Z3QvMC4wMzg0XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1faCA6PSBudW0vMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1fY3B1ZSA6PSBudW0vMC4wMzg0XQoKCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1soKHN1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIgJiBtb250aCAlaW4lIGMoMzo1KSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIiAmIG1vbnRoICVpbiUgYygzOjUpICYgeWVhciA+PSAyMDA5ICYgKGhhdWxfZHVyID4gMC4yNSAgJiBoYXVsX2R1ciA8IDAuNDIpKSksIGhhdWxfaWRdKQoKCmBgYAoKTkVVUyBGYWxsCgpgYGB7ciBORVVTLUZhbGwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA5LDEwLDExIG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg0LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4NSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLUZhbGwgcHJvY2Vzc2luZ30KCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfZmFsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbKChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiB5ZWFyID49IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjI1ICAmIGhhdWxfZHVyIDwgMC40MikpKSwgaGF1bF9pZF0pCmBgYAoKIyMjI05JR0ZTCk5vcnRoZXJuIElyZWxhbmQKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBzcHJpbmcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIE5JR0ZTIDEgcHJvY2Vzc2luZ30KbmlnZnNfMV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiICYgbW9udGggJWluJSBjKDIsMyw0KSwgaGF1bF9pZF0pCmBgYAoKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBmYWxsIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAxMCwxMSBtb250aHMKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTklHRlMgNCBwcm9jZXNzaW5nfQpuaWdmc180X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIgJiBtb250aCAlaW4lIGMoMTAsMTEpLCBoYXVsX2lkXSkKYGBgCgojIyMjTm9yLUJUUwoKT0cgRklTSEdMT0IgaW5jbHVkZXMgTm9yLUJUUy0xIGFzIHdlbGwsIGJ1dCB0aGlzIHdhcyBub3Qgc2hhcmVkIGJ5IEwuIFBlY3VjaGV0LCBhbmQgdGhlcmVmb3JlIGlnbm9yZWQKCk5vci1CVFMtMwpgYGB7ciBOb3ItQlRTLTN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDgsOSwxMAotU29tZXdoYXQgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLU51bWJlciBvZiBoYXVscyBpcyB2YXJpYWJsZSwgYnV0IG5vIGNsZWFyIHllYXJzIHRvIGV4Y2x1ZGUKLUxhdXJlbmUgUGVjdWNoZXQgKFUgVHJvbXNvKSB0b2xkIHVzIHRoYXQgb25seSBzdXJ2ZXlzIDIwMDQgYW5kIG9ud2FyZHMgd29yayBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2VzCgoKYGBge3IgTm9yLUJUUy0zIHByb2Nlc3Npbmd9Cm5vcl9idHNfM19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIgJiBtb250aCAlaW4lIGMoODoxMCkgJiB5ZWFyID49IDIwMDQsIGhhdWxfaWRdKQpgYGAKCiMjIyNOUy1JQlRTCgpOUy1JQlRTLTEKYGBge3IgTlMtSUJUUy0xfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxLDIsMwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUxpbmVhciBpbmNyZWFzZSBpbiByaWNobmVzcywgY3V0b2ZmIG9uICMgaGF1bHMgbW9yZSBjbGVhcgotTGluZWFyIGluY3JlYXNlLCBidXQgc29tZXdoYXQgY2xlYXIgYnJlYWsgYmV0d2VlbiBsYXRlIDcwcyBhbmQgbWlkLTgwcywgb25seSBrZWVwIGhhdWxzIGFmdGVyIDE5ODQKCgpgYGB7ciBOUy1JQlRTLTEgcHJvY2Vzc2luZ30KbnNfaWJ0c18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIiAmIG1vbnRoICVpbiUgYygxOjMpICYgeWVhciA+PSAxOTg0LCBoYXVsX2lkXSkKYGBgCgpOUy1JQlRTLTMKYGBge3IgTlMtSUJUUy0zfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5TLUlCVFMtMyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA3LDgsOQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1FYXJseSB5ZWFycyBsb3dlciAjIGhhdWxzLCB3aWxsIHN0YXJ0IGF0IDE5OTgKCgpgYGB7ciBOUy1JQlRTLTMgcHJvY2Vzc2luZ30KbnNfaWJ0c18zX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIiAmIG1vbnRoICVpbiUgYyg3OjkpICYgeWVhciA+PSAxOTk4LCBoYXVsX2lkXSkKYGBgCgoKIyMjI05aCgpOWi1DSEFUCgpgYGB7ciBOWi1DSEFUfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEyLDEsMiAoTk9URSBUSEFUIFRISVMgTlotQ0hBVCBTVVJWRVkgQ1JPU1NFUyBZRUFSLCBTTyBXRSBBTFJFQURZIExVTVBFRCAxMiB3aXRoIE5FWFQgeWVhcikKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGFmdGVyIDE5OTUKCgpgYGB7ciBOWi1DSEFUIHByb2Nlc3Npbmd9CgoKbnpfY2hhdF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiICYgbW9udGggJWluJSBjKDEyLDEsMikgJiB5ZWFyID49IDE5OTUsIGhhdWxfaWRdKQoKYGBgCgpOWi1FQ1NJCgpgYGB7ciBOWi1FQ1NJfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDQsNSw2Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwotR2FwIGJldHdlZW4gMTk5NSBhbmQgMjAwNSwgYnV0IHdlIGhhdmUgMTAgdG90YWwgeWVhcnMgc28gd2UnbGwga2VlcCBmb3Igbm93CgoKYGBge3IgTlotRUNTSSBwcm9jZXNzaW5nfQpuel9lY3NpX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIgJiBtb250aCAlaW4lIGMoNCw1LDYpLCBoYXVsX2lkXSkKYGBgCgpOWi1TVUJBCgpgYGB7ciBOWi1TVUJBfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDExIGFuZCAxMgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1GYXIgbW9yZSBoYXVscyBpbiAxOTkwcywgdGhlc2UgZWFybHkgc2FtcGxpbmcgeWVhcnMgd2lsbCBiZSBleGNsdWRlZCAoc3RhcnQgaW4gMjAwMCkKCgpgYGB7ciBOWi1TVUJBIHByb2Nlc3Npbmd9Cm56X3N1YmFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIiAmIG1vbnRoICVpbiUgYygxMSwxMikgJiB5ZWFyID49IDIwMDAsIGhhdWxfaWRdKQpgYGAKCk5aLVdDU0kKCmBgYHtyIE5aLVdDU0l9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMyw0Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLUxpbmVhciBkZWNyZWFzZSBpbiAjIG9mIGhhdWxzIHRocm91Z2ggdGltZSwgbGVhdmUgb3V0IGZpcnN0IHR3byB5ZWFycyB3aXRoIGhpZ2hlc3QgIyBoYXVscyAoPj0gMTk5NSkKCgpgYGB7ciBOWi1XQ1NJIHByb2Nlc3Npbmd9Cm56X3djc2lfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIiAmIG1vbnRoICVpbiUgYygzLDQpICYgeWVhciA+PSAxOTk1LCBoYXVsX2lkXSkKYGBgCgojIyMjUFQtSUJUUwpQVC1JQlRTCmBgYHtyIFBULUlCVFN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCgpgYGB7ciBQVC1JQlRTIHByb2Nlc3Npbmd9CnB0X2lidHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJQVC1JQlRTIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSwgaGF1bF9pZF0pCmBgYAoKIyMjI1JPQ0tBTEwKCmBgYHtyIFJPQ0tBTEx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOCw5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKCmBgYHtyIFJPQ0tBTEwgcHJvY2Vzc2luZ30Kcm9ja2FsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiICYgbW9udGggJWluJSBjKDgsOSksIGhhdWxfaWRdKQpgYGAKCiMjIyNTLUdFT1JHCgpgYGB7ciBTLUdFT1JHfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEgYW5kIDIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBleGNlcHQgZm9yIDIwMDMsIHdpbGwgYmUgZXhjbHVkZWQKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscywgZXhjZXB0IGZvciAyMDEyLCB3aWxsIGJlIGV4Y2x1ZGVkCgoKYGBge3IgU0dlb3JnZSBwcm9jZXNzaW5nfQpzX2dlb3JnX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIgJiBtb250aCAlaW4lIGMoMSwyKSAmICEoeWVhciAlaW4lIGMoMjAwMywyMDEyKSksIGhhdWxfaWRdKQpgYGAKCiMjIyNTQ1MKClNwcmluZwpgYGB7ciBTQ1MtU1BSSU5HfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDIsMyw0Ci1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIChub3J0aGVybiBsYXRpdHVkZXMgb25seSBzYW1wbGVkIGluIGVhcmx5IHllYXJzKSwgb25seSBpbmNsdWRlIGxvbmdpdHVkZXMgPCAtNjIgYW5kIGxhdGl0dWRlcyA8IDQ1LjUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1OdW1iZXIgb2YgaGF1bHMgaXMgdmFyaWFibGUsIGV4Y2x1ZGUgc3VwZXIgbG93IGFuZCBoaWdoIG51bWJlcnMgKDE5ODUsMTk5NCwyMDE1LDIwMTkpCgoKYGBge3Igc2NzX3NwcmluZyBwcm9jZXNzaW5nfQpzY3Nfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIgJiBtb250aCAlaW4lIGMoMiwzLDQpICYgISh5ZWFyICVpbiUgYygxOTg1LDE5OTQsMjAxNSwyMDE5KSkgJiBsb25naXR1ZGVfYWRqIDwgLTYyICYgbGF0aXR1ZGUgPCA0NS41LCBoYXVsX2lkXSkKYGBgCgpTVU1NRVIKYGBge3IgU0NTLVNVTU1FUn0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA2LDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGluY3JlYXNlcyBsaW5lYXJseSwgbm90IGEgY2xlYXIgYnJlYWsgcG9pbnQsIHVzaW5nIGJyZWFrcG9pbnQgZnJvbSAjIG9mIGhhdWxzLCBidXQgd2lsbCBleGNsdWRlIDIwMTAgd2hpY2ggaGFzIGEgdmVyeSBoaWdoIHJpY2huZXNzCi0jIEhhdWxzIGluY3JlYXNlcyBsaW5lYXJseSBmcm9tIH4xMjAgaW4gMTk3MCB0byB+MjIwIGluIDIwMjAsIG5vdCBhIGNsZWFyIGJyZWFrcG9pbnQsIGJ1dCB3aWxsIGdvIHdpdGggMTk4NiBiZWNhdXNlIHRoZXJlIGlzIGEganVtcCBiZXR3ZWVuIDg1IGFuZCA4NgotR2VhciBjaGFuZ2UgaW4gMTk4MyAoRWxsaW5nc2VuIGV0IGFsLiAyMDE1KQoKCmBgYHtyIHNjc19zdW1tZXIgcHJvY2Vzc2luZ30Kc2NzX3N1bW1lcl9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiICYgbW9udGggJWluJSBjKDYsNyw4KSAmIHllYXIgPj0gMTk4NiAmIHllYXIgIT0gMjAxMCwgaGF1bF9pZF0pCmBgYAoKCiMjI1NFVVMKCgpTcHJpbmcKCmBgYHtyIFNFVVMtc3ByaW5nfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1Db25zaXN0ZW50IHJpY2huZXNzIHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gMTk4OSBhbmQgMjAxOCwgd2lsbCBleGNsdWRlCgpgYGB7ciBzZXVzX3NwcmluZyBwcm9jZXNzaW5nfQpzZXVzX3NwcmluZ19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIiAmIG1vbnRoICVpbiUgYyg0LDUsNikgJiB5ZWFyICE9IDE5ODkgJiB5ZWFyICE9IDIwMTgsIGhhdWxfaWRdKQpgYGAKCgpTdW1tZXIKCmBgYHtyIFNFVVMtc3VtbWVyfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgbG93IGluIGZpcnN0IHllYXIsIG90aGVyd2lzZSBva2F5LCBqdXN0IGV4Y2x1ZGUgZmlyc3QgeWVhciAoMTk4OSkKCmBgYHtyIHNldXNfc3VtbWVyIHByb2Nlc3Npbmd9CnNldXNfc3VtbWVyX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiICYgbW9udGggJWluJSBjKDcsOCkgJiB5ZWFyICE9IDE5ODksIGhhdWxfaWRdKQpgYGAKCgpGYWxsCgpgYGB7ciBTRVVTLWZhbGx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gZmlyc3QgeWVhciwgb3RoZXJ3aXNlIG9rYXksIGp1c3QgZXhjbHVkZSBmaXJzdCB5ZWFyICgxOTg5KQoKCmBgYHtyIHNldXNfZmFsbCBwcm9jZXNzaW5nfQpzZXVzX2ZhbGxfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgeWVhciAhPSAxOTg5LCBoYXVsX2lkXSkKYGBgCgoKIyMjI1NXQy1JQlRTCgpTY290bGFuZCBTaGVsZiBTZWEKClNXQy1JQlRTIDEKCmBgYHtyIFNXQy1JQlRTLTF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMSwyLDMKLVNvbWV3aGF0IGluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIGJ1dCB0aGlzIHNob3VsZCBiZSBhZGRyZXNzZWQgaW4gc3BhdGlhbCBzdGFuZGFyZGl6YXRpb24gcHJvY2VkdXJlIAotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCBleGNlcHQgbG93IGluIDE5OTUsIGp1c3QgZXhjbHVkZSAxOTk1CgoKCmBgYHtyIHN3Yy1pYnRzLTEgcHJvY2Vzc2luZ30Kc3djX2lidHNfMV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiICYgbW9udGggJWluJSBjKDEsMiwzKSAmIHllYXIgIT0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKU1dDLUlCVFMgNAoKYGBge3IgU1dDLUlCVFMtNH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxMCwxMSwxMgotU29tZXdoYXQgaW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSAoc291dGhlcm4gbGF0aXR1ZGVzIG9ubHkgc2FtcGxlZCBpbiBlYXJseSB5ZWFycyksIGJ1dCB0aGlzIHNob3VsZCBiZSBhZGRyZXNzZWQgaW4gc3BhdGlhbCBzdGFuZGFyZGl6YXRpb24gcHJvY2VkdXJlIAotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUgKGVzcGVjaWFsbHkgYWZ0ZXIgbWlkIDkwcykKLSMgSGF1bHMgY29uc2lzdGVudCBleGNlcHQgbG93IGJlZm9yZSAxOTk1IGFuZCBsb3cgaW4gMjAxMywgZXhjbHVkZSB0aGVzZQoKCmBgYHtyIHN3Yy1pYnRzLTQgcHJvY2Vzc2luZ30Kc3djX2lidHNfNF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiICYgbW9udGggJWluJSBjKDEwLDExLDEyKSAmIHllYXIgIT0gMTk5NSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKIyMjI1dDQU5OCgoKYGBge3IgV0NBTk59CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSGVyZSwgb25lIGV4Y2VwdGlvbiwgd2lsbCB1c2UgZm91ciBtb250aHMgKDYsNyw4LDkpIGJlY2F1c2UgYWxsIHNhbXBsZWQgY29uc2lzdGVudGx5LCBhbmQgbG93ZXIgbGF0aXR1ZGUgYXJlYXMgc2FtcGxlZCBsYXRlciBpbiB0aGUgc3VtbWVyIGNvbnNpc3RlbnRseQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCgoKYGBge3Igd2Nhbm4gcHJvY2Vzc2luZ30Kd2Nhbm5fa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJXQ0FOTiIgJiBtb250aCAlaW4lIGMoNjo5KSwgaGF1bF9pZF0pCmBgYAoKIyMjI1dDVFJJCi1FeGNsdWRlIGJlY2F1c2Ugb25seSAxMCB5ZWFycyBhbmQgb3ZlcmxhcHMgc29tZXdoYXQgd2lpdGggV0NBTk4KCmBgYHtyIHdjdHJpIHByb2Nlc3Npbmd9CndjdHJpX2tlZXAgPC0gTlVMTApgYGAKCgojIyMjWkFGCgpBVEwKYGBge3IgWkFGIEFUTH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSW5jbHVkZSAxLDIsMwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lIGFmdGVyIDE5OTEKCgpgYGB7ciB6YWYgYXRsIHByb2Nlc3Npbmd9CnphZl9hdGxfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtQVRMIiAmIG1vbnRoICVpbiUgYygxOjMpICYgeWVhciA+PSAxOTkxLCBoYXVsX2lkXSkKYGBgCgoKSU5ECmBgYHtyIFpBRiBJTkR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUluY2x1ZGUgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IGJlZm9yZSAyMDAxLCBhbmQgdGhlbiBhbHNvIGluIDIwMDUgYW5kIDIwMDktMjAxMAoKCmBgYHtyIHphZiBpbmQgcHJvY2Vzc2luZ30KemFmX2luZF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiICYgbW9udGggJWluJSBjKDQ6NikgJiB5ZWFyICVpbiUgYygxOTg1OjIwMDEsMjAwNSwgMjAwOSwyMDEwKSwgaGF1bF9pZF0pCmBgYAoKCiMjIyNDb21iaW5lIGFsbCBsaXN0cyB0aGF0IGhhdmUgX2tlZXAKYGBge3IgY29tYmluZSBsaXN0c30KI2FsbCBvYmplY3RzIHdpdGggX2tlZXAKbGlzdF9vYmogPC0gbHMocGF0dGVybiA9ICJfa2VlcCIpCgojY29tYmluZQpmaXNoZ2xvYl9oYXVsaWRzX3RvX2tlZXAgPC0gdW5saXN0KGxhcHBseShsaXN0X29iaiwgZ2V0KSkgIzIyOTg5NCBoYXVscyAoU3RhcnRlZCB3aXRoIDI3ODQwNSkKCkZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW4gPC0gRmlzaEdsb2IuMTB5ZWFyLnNwcFtoYXVsX2lkICVpbiUgZmlzaGdsb2JfaGF1bGlkc190b19rZWVwLF0KCiNSZXF1aXJlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZm9yIGFsbCBvYnNlcnZhdGlvbnMKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiA8LSBGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuW2NvbXBsZXRlLmNhc2VzKEZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW5bLC4obGF0aXR1ZGUsIGxvbmdpdHVkZSldKV0gI2NoZWNrIHRoYXQgdGhpcyB3b3JrcwoKI2Fub3RoZXIgY2hlY2sgZm9yICMgeWVhcnMgc2FtcGxlZAojbmV3IHJvdyBmb3IgdG90YWwgbnVtYmVyIG9mIHllYXJzIHNhbXBsZWQKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblsseWVhcnNfc2FtcGxlZCA6PSBsZW5ndGgodW5pcXVlKHllYXIpKSwuKHN1cnZleV91bml0KV0KVmlldyh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblssLihzdXJ2ZXlfdW5pdCwgeWVhcnNfc2FtcGxlZCldKSkKCiNzYXZlCnNhdmVSRFMoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGEiLCJjbGVhbmVkIiwiRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbi5yZHMiKSkKCmBgYAoKCiMjIyNTb21lIHN1cnZleXMgc2FtcGxlIHRocm91Z2ggZW5kIG9mIHllYXIsIGZpeCB0aGVzZQotTk9URSBUSEFUIFRISVMgTlotQ0hBVCBTVVJWRVkgQ1JPU1NFUyBZRUFSLCBTTyBMVU1QIDEgYW5kIDIgd2l0aCBwcmV2aW91cyB5ZWFyCg==